#include<stdio.h>
int main(void) {
int a=(1, 2), 3;
printf("%d", a);
return 0;
}
输出:2
任何人都能解释输出是2吗?
答案 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)因为这是两个单独的陈述。
我希望这能回答你的问题。