#include<stdio.h>
#include<stdlib.h>
int main() {
int x = 5;
int y = 0;
x++, y = x*x;
printf("x is %d\n", x);
printf("y is %d\n", y);
}
问题: 为什么上面代码的输出是:
x is 6
y is 36
而不是
x is 6
y is 25
推理:
我认为它应该是后者,因为赋值运算符的优先级高于逗号,因此首先要对y
进行赋值,将其设置为25
,然后x
应进行评估并设置为6
。
答案 0 :(得分:3)
逗号运算符的LHS必须在逗号运算符的RHS之前进行评估;两者之间有一个完整的序列点。
因此,必须对x++
进行评估,并且必须在考虑表达式的y = x * x
部分或评估其任何部分之前进行所有副作用(增量)。
答案 1 :(得分:3)
优先级与程序的语法树有关,而与程序的执行方式无关。这些优先级正在做的是消除
之间的歧义x++, (y = x*x) /* this is how your programs gets parsed */
和
(x++ , y) = x*x /* this is NOT how it is parsed */
解析程序后,,
的执行规则声明表达式从左到右进行评估,以便x++
在y = x*x
之前运行。最后,,
与;
非常相似,除了您可以将它放在期望表达式而不是语句的位置。
答案 2 :(得分:1)
优先顺序并不决定评估的顺序。 =
绑定高于,
,因此表达式为:
(x++), ( y = x*x;)
逗号从左到右进行评估,并包含一个序列点,因此您的表达式类似于:
x++ ; y = x*x ;