为什么这个C程序的输出是这样的?

为什么这个C程序的输出是这样的?,c,C,节目: int main( ) { printf("%d",printf("%d %d",5,5)&printf("%d %d",7,7)); return 0; } 输出: 5 57 73 我是C语言的新手,我能猜出5577是从哪里来的,但不知道3是从哪里来的。有人能解释一下输出吗?如果您将二进制和应用于3和3(这两个都是嵌套printf调用的返回值),您将得到3 请注意,代码实际上包含未定义的行为,因为嵌套调用的顺序没有定义。函数的返回值是传

节目:

   int main( )
    {
    printf("%d",printf("%d %d",5,5)&printf("%d %d",7,7));
    return 0;
    }
输出:

5 57 73

我是C语言的新手,我能猜出5577是从哪里来的,但不知道3是从哪里来的。有人能解释一下输出吗?

如果您将二进制
应用于
3
3
(这两个都是嵌套
printf
调用的返回值),您将得到
3


请注意,代码实际上包含未定义的行为,因为嵌套调用的顺序没有定义。函数的返回值是传输的字符数,如果有错误,则返回负值

printf(“%d%d”,5,5)
如果没有错误,则返回
3

printf(“%d%d”,7,7)
如果没有错误,也会返回
3

因此
printf(“%d%d”、5,5)&printf(“%d%d”、7,7)
3&3
的值,其计算值为两个printf返回的值

printf返回打印的字符数。 在您的例子中,
printf(“%d%d”,5,5)
打印了三个字符,分别为两个5和一个空格,类似地,
printf(“%d%d”,7,7)
也打印了两个7和一个空格。因此,两个printf都返回3

因此,3是
3&3

的结果,如您所见:,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
在这个阶段我们得到:
5577

然后
3&3=3
,最后您得到了以下输出:

5 57 73

关于。

这种类型的代码给C带来了坏名声…请注意,
7 75 53
也将是一个有效的结果,因为
&
不是标准点(C.f.)。为什么printf(“%d%d”,5,5)返回3?@AshwinSingh,因为这就是
printf
返回的结果。打印字符的数量。你是指未指定的行为而不是未定义的行为吗?@哎呀,老实说,我懒得去查。我想这是未指定的。“未指定行为的一个例子是函数参数的求值顺序。”,我很确定操作符在这方面与函数类似。