#include "stdio.h"
int main()
{
int a=3,b=4,c=5;
printf("%d %d %d\n",(a,b,c));
}
结果是:
5 2280760 2281472
谁能解释一下?
#include "stdio.h"
int main()
{
int a=3,b=4,c=5;
printf("%d %d %d\n",(a,b,c));
}
结果是:
5 2280760 2281472
谁能解释一下?
您导致了未定义的行为:
这 -(a,b,c)
被评估为最后一个参数,例如c
,所以第一个打印的数字是 5 ( c = 5
) 其他两个是未初始化的参数。
它不起作用。它会产生未定义的行为。
您提供了三个格式说明符printf
并只提供了一个可变参数,因为在 C(a,b,c)
中是一个表达式,其计算结果为c
(阅读有关逗号运算符)的值
由于参数的数量与格式说明符的数量不匹配,因此行为未定义。
printf
您的调用只有两个参数:"%d %d %d"
以及评估的结果(a,b,c)
。
的结果(a,b,c)
只是列表中的最后一项:c
,即 5。它被传递给 printf,它显示5
第一个 %d。
由于没有更多参数,剩下的 %d 只显示调用堆栈上的任何垃圾,从而导致您看到奇怪的值。
我认为您缺少逗号表达式,逗号表达式包含两个由逗号分隔的任何类型的操作数,并且具有从左到右的关联性。左操作数被完全评估,可能产生副作用,如果有,它的值将被丢弃。然后评估右操作数。在通常的一元转换之后,逗号表达式结果的类型和值是其右操作数的类型和值。
逗号表达式的结果不是左值。
所以你得到上述结果
正如 IBM 在其文档中所述:
逗号运算符的主要用途是在以下情况下产生副作用:
- 调用函数
- 进入或重复一个迭代循环
- 测试条件
- 其他需要副作用但并不立即需要表达式结果的情况
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
。