逗号在c中的运算符

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

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

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

在声明中

 a = (1, 2), 3; 

,使用的是逗号运算符 。 由于=运算符的运算符优先级高于运算符的运算符优先级,因此expression式操作数(1, 2)将绑定到= as

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

在逗号运算符的情况下,逗号运算符的左操作数被评估为voidexpression式,然后评估右操作数并且结果具有右操作数的值和types

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

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

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

因此,声明:

a = (1, 2), 3;

相当于:

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

并且expression式(1, 2)评估为2

的结果:

 a = x, y => x a = (i, j) => j 

因此,如果我们有:

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

如这里所说:

逗号运算符以类似于分号终止语句的方式分离expression式(具有值),expression式序列与括号中的语句序列类似:(a,b,c)是序列以逗号分隔的expression式,其计算结果为最后一个expression式c; {a; b; c;}是一个语句序列,并不计算任何值。 逗号只能出现在两个expression式之间 – 逗号分隔expression式 – 不像在分号(在非块)语句结尾处出现的分号 – 分号终止语句。

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

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