计划:为什么这个C程序的输出?
int main()
{
printf("%d",printf("%d %d",5,5)&printf("%d %d",7,7));
return 0;
}
输出:
5 57 73
我是新来的C,我能猜出其中的5 57 7而来,但不知道其中3是从哪里来的。有人可以解释输出吗?
计划:为什么这个C程序的输出?
int main()
{
printf("%d",printf("%d %d",5,5)&printf("%d %d",7,7));
return 0;
}
输出:
5 57 73
我是新来的C,我能猜出其中的5 57 7而来,但不知道其中3是从哪里来的。有人可以解释输出吗?
如果应用二进制AND
到3
和3
(这两者都是嵌套printf
调用的返回值),你得到3
作为结果。
注意,代码实际上包含未定义的行为,因为嵌套调用的顺序没有定义。
你的意思是*未指定的行为*而不是*未定义的行为*? – ouah 2012-07-29 16:48:54
@ouah说实话,我懒得去查。 – 2012-07-29 16:50:17
我认为这是没有说明的。 “非特定行为的一个例子就是函数参数的评估顺序。”我非常确定操作符就像这方面的函数。 – 2012-07-29 17:30:11
printf
该函数的返回值是发送的字符数,或负的值,如果有一个误差。
printf("%d %d",5,5)
回报3
如果没有错误
printf("%d %d",7,7)
也返回3
如果没有错误
所以printf("%d %d",5,5) & printf("%d %d",7,7)
是3 & 3
被评估为3
。
为什么printf(“%d%d”,5,5)返回3? – 2012-07-29 16:42:46
@AshwinSingh因为那是'printf'返回的内容。打印字符的数量。 – 2012-07-29 16:43:35
3是由两个printf的返回值的Bitwise AND。
printf的返回打印的字符数。 你的情况,printf("%d %d",5,5)
已打印的三个字符是两个5和一个空间,同样printf("%d %d",7,7)
也打印2 7和一个空间。因此,这两种的printf将返回3.
因此,3是3 & 3
的结果,你可以在这里看到:http://en.wikipedia.org/wiki/Printf_format_string,printf的返回打印的字符数,因此:
printf("%d",printf("%d %d",5,5)&printf("%d %d",7,7));
由的:
printf("%d %d",5,5) return 3 (5 space and 5) and print 5 5
printf("%d %d",7,7) return 3 (7 space and 7) and print 7 7
在这个阶段,我们得到:5 57 7
而且3 & 3 = 3
,最后你得到这样的输出:
5 57 73
问候。
这种类型的代码是什么给℃的坏名声...... – 2012-07-29 16:42:08
要知道,'7 75 53'将是一个有效的成果,也为'&'没有sqeuence点(CF HTTP://计算器。 COM /问题/ 4176328 /未定义行为和序列点)。 – kay 2012-07-29 17:54:52