c中的逗号运算符

时间:2017-09-12 13:06:27

标签: c comma-operator

#include<stdio.h> 
int main(void) {
   int a=(1, 2), 3; 
   printf("%d", a);
   return 0;
}

输出:2
任何人都能解释输出是2吗?

3 个答案:

答案 0 :(得分:62)

  

任何人都可以解释输出是2吗?

因为赋值运算符=)的优先级高于逗号运算符,)。

因此,声明:

a = (1, 2), 3;

相当于:

(a = (1, 2)), 3;

,表达式(1, 2)的计算结果为2

答案 1 :(得分:30)

  

任何人都可以解释输出是2吗?

声明

a = (1, 2), 3;   

,使用的是comma operator。 由于=运算符的运算符优先级高于,运算符的运算符优先级,表达式操作数(1, 2)将绑定到=

(a = (1, 2)), 3;  

对于逗号运算符,将逗号运算符的左操作数计算为void表达式,然后计算右操作数,结果具有右操作数的值和类型

这里有两个逗号运算符。对于表达式(1, 2)中的第一个逗号运算符,1将被评估为void表达式,然后2将被评估并将分配给a
现在已经发生了对a的副作用,因此将评估第二个逗号运算符3的右操作数,并且表达式(a = (1, 2)), 3的值将为3。< / p>

答案 2 :(得分:3)

结果:

a = x, y     =>     x

a = (i, j)   =>     j

因此,如果我们有:

x = (1 , 2)

a = (1 , 2) , 3     =>     2

如上所述here

  

逗号运算符以某种方式分隔表达式(具有值)   类似于分号如何终止语句和序列   表达式括在括号中,类似于序列   语句括在括号中:(a,b,c)是一系列的   表达式,以逗号分隔,计算结果为最后一个   表达式c而{a; b; c;}是一系列语句,并且确实如此   不评估任何价值。逗号只能出现在两个之间   表达式 - 逗号分隔表达式 - 与分号不同,   它出现在(非块)语句的末尾 - 分号   终止陈述。

     

逗号运算符具有任何C运算符的最低优先级,并且   充当序列点。在逗号和分号的组合中,   分号的优先级低于逗号,因为分号分隔   语句,但逗号出现在语句中,符合   它们作为普通标点符号使用:a,b; c,d分组为(a,b);   (c,d)因为这是两个单独的陈述。

我希望这能回答你的问题。