无法理解C程序的输出

时间:2014-03-13 16:13:32

标签: c

#include<stdio.h>
int main()
{
  int x=10,y=12;
  printf("%d",(x,y));
  return 0;
}

该程序的输出是12.如何?

3 个答案:

答案 0 :(得分:4)

您偶然使用comma operator

在C和C ++编程语言中,逗号运算符(由标记,表示)是一个二元运算符,用于计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(和类型)。

那就是说,

printf("%d",(x,y));

在功能上等同于

printf("%d", y);

答案 1 :(得分:4)

您正在评估的表达式是:

x,y

此表达式使用逗号运算符。标准( 6.5.17逗号运算符)表示:

  

逗号运算符的左操作数被计算为void表达式;有一个   其评估与右操作数之间的序列点。然后是正确的   操作数被评估;结果有其类型和价值。

因此,在您的代码中,x,y评估为y,其值为12

有关更广泛的讨论,我建议您cppreference.com。虽然这讨论了C ++,但对此运算符的讨论在C语境中是有效的。特别与您的问题相关的是此部分:

  

各种以逗号分隔的列表中的逗号,例如函数参数列表(f(a, b, c)),初始化列表int a[] = {1,2,3}或初始化语句(int i, j;)不是逗号运算符。如果需要在该上下文中使用逗号运算符,则必须使用括号括起来:f(a, (n++, n+b), c)

这正是你问题中的情况。如果你写了:

printf("%d", x, y);

然后就不会使用逗号运算符,并且你会向printf提供一个参数而不是格式说明符。

答案 2 :(得分:0)

这是因为评估了第一个(x,y) inside()表达式是x,y它们是从左到右计算的,因为Comma运算符的关联性是left to right,所以求值(x,y)的最后一个值是y。
阅读operator precedence and associativity rule以及如何在运算符优先级下计算表达式以理解这些类型的表达式