这段代码如何工作'printf(“%d%d%d \ n”,(a,b,c));'

时间:2012-08-19 07:56:36

标签: c

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

结果是:

5 2280760 2281472

谁可以解释一下?

5 个答案:

答案 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中所述:

  

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

     
      
  1. 调用函数
  2.   
  3. 输入或重复   迭代循环
  4.   
  5. 测试条件
  6.   
  7. 需要副作用但不立即表达结果的其他情况
  8.   

答案 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