c中的逗号运算符

Kr *_*jun 39 c comma-operator

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

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

眠りネ*_*ネロク 62

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

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

因此,声明:

a = (1, 2), 3;

相当于:

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

并且表达式(1, 2)求值为2.

  • @Olaf哦,是的,它确实回答了这个问题:它意味着`a`被赋予表达式`(1,2)`的值,即'2`.`,3`与作业无关. (33认同)
  • @Gam重新读取表达式`(a =(1,2)),3`:执行赋值的子表达式甚至不包含"3".那清楚了吗? (4认同)
  • @cmaster哦对不起我现在明白了!变量取值2(这里1没用),然后表达式"3"被评估,但它无关紧要 (3认同)

hac*_*cks 29

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

在声明中

a = (1, 2), 3;   
Run Code Online (Sandbox Code Playgroud)

,used是逗号运算符.由于运算符的=运算符优先级高于运算符的运算符优先级,,表达式操作数(1, 2)将绑定为=as

(a = (1, 2)), 3;  
Run Code Online (Sandbox Code Playgroud)

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

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