2
#include "stdio.h"
int main()
{
    int a=3,b=4,c=5;
    printf("%d %d %d\n",(a,b,c));
}

结果是:

5 2280760 2281472

谁能解释一下?

4

5 回答 5

7

您导致了未定义的行为:

这 -(a,b,c)被评估为最后一个参数,例如c,所以第一个打印的数字是 5 ( c = 5) 其他两个是未初始化的参数。

于 2012-08-19T07:59:14.267 回答
4

它不起作用。它会产生未定义的行为。

您提供了三个格式说明符printf并只提供了一个可变参数,因为在 C(a,b,c)中是一个表达式,其计算结果为c(阅读有关逗号运算符)的值

由于参数的数量与格式说明符的数量不匹配,因此行为未定义。

于 2012-08-19T07:58:53.253 回答
2

printf您的调用只有两个参数:"%d %d %d"以及评估的结果(a,b,c)

的结果(a,b,c)只是列表中的最后一项:c,即 5。它被传递给 printf,它显示5第一个 %d。

由于没有更多参数,剩下的 %d 只显示调用堆栈上的任何垃圾,从而导致您看到奇怪的值。

于 2012-08-19T08:01:46.950 回答
0

我认为您缺少逗号表达式,逗号表达式包含两个由逗号分隔的任何类型的操作数,并且具有从左到右的关联性。左操作数被完全评估,可能产生副作用,如果有,它的值将被丢弃。然后评估右操作数。在通常的一元转换之后,逗号表达式结果的类型和值是其右操作数的类型和值。

逗号表达式的结果不是左值。

所以你得到上述结果

正如 IBM 在其文档中所述:

逗号运算符的主要用途是在以下情况下产生副作用:

  1. 调用函数
  2. 进入或重复一个迭代循环
  3. 测试条件
  4. 其他需要副作用但并不立即需要表达式结果的情况
于 2012-08-19T08:06:22.643 回答
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

于 2015-10-10T03:20:53.697 回答