2012-07-29 58 views
0

计划:为什么这个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是从哪里来的。有人可以解释输出吗?

+0

这种类型的代码是什么给℃的坏名声...... – 2012-07-29 16:42:08

+1

要知道,'7 75 53'将是一个有效的成果,也为'&'没有sqeuence点(CF HTTP://计算器。 COM /问题/ 4176328 /未定义行为和序列点)。 – kay 2012-07-29 17:54:52

回答

7

如果应用二进制AND33(这两者都是嵌套printf调用的返回值),你得到3作为结果。

注意,代码实际上包含未定义的行为,因为嵌套调用的顺序没有定义。

+2

你的意思是*未指定的行为*而不是*未定义的行为*? – ouah 2012-07-29 16:48:54

+0

@ouah说实话,我懒得去查。 – 2012-07-29 16:50:17

+1

我认为这是没有说明的。 “非特定行为的一个例子就是函数参数的评估顺序。”我非常确定操作符就像这方面的函数。 – 2012-07-29 17:30:11

6

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

+0

为什么printf(“%d%d”,5,5)返回3? – 2012-07-29 16:42:46

+1

@AshwinSingh因为那是'printf'返回的内容。打印字符的数量。 – 2012-07-29 16:43:35

2

3是由两个printf的返回值的Bitwise AND

printf的返回打印的字符数。 你的情况,printf("%d %d",5,5)已打印的三个字符是两个5和一个空间,同样printf("%d %d",7,7)也打印2 7和一个空间。因此,这两种的printf将返回3.

因此,3是3 & 3

0

的结果,你可以在这里看到: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 

问候。

相关问题