#include "stdio.h"
int main()
{
int a=3,b=4,c=5;
printf("%d %d %d\n",(a,b,c));
}
结果是:
5 2280760 2281472
谁可以解释一下?
答案 0 :(得分:7)
您导致了未定义的行为:
此 - (a,b,c)
被评估为最后一个参数,例如c
,因此第一个打印的数字是5(c = 5
),其他两个是未初始化的参数。
答案 1 :(得分:4)
它不起作用。它会产生不确定的行为。
您为printf
提供了三个格式说明符,并且只提供了一个可变参数,因为在C (a,b,c)
中是一个表达式,其值为c
(读取有关逗号的内容)操作)
由于参数的数量与格式说明符的数量不匹配,因此行为未定义。
答案 2 :(得分:2)
printf
来电只有两个参数:"%d %d %d"
和评估(a,b,c)
的结果。
(a,b,c)
的结果只是列表中的最后一项:c
,即5.这是传递给printf的,它显示5
代表第一个%d。
由于没有其他参数,剩余的%d只显示调用堆栈上的垃圾,导致您看到的奇怪值。
答案 3 :(得分:0)
我认为你遗漏了逗号表达式,逗号表达式包含两个由逗号分隔的任何类型的操作数,并具有从左到右关联性。左操作数被完全评估,可能产生副作用,如果有的话,它的值被丢弃。然后评估右操作数。在通常的一元转换之后,逗号表达式的结果的类型和值是其右操作数的类型和值。
逗号表达式的结果不是左值。
所以你得到了上面的结果
正如IBM在their documentation中所述:
逗号运算符的主要用途是产生副作用 以下情况:
- 调用函数
- 输入或重复 迭代循环
- 测试条件
- 需要副作用但不立即表达结果的其他情况
醇>
答案 4 :(得分:0)
MByD说:
这 - (a,b,c)被评估为最后一个参数,例如c,所以第一个打印的数字是5(c = 5),其他两个是未初始化的参数。
但是a和b并非未初始化。 (试试下面的代码)
int a=3,b=4,c=5;
printf("%d %d %d\n",a,(a,b,c),b);
由于括号它被假定为一个参数,并且由于从从左到右解析(如用户空指针所说),它发现c是它的值。
以上代码输出3 5 4
。