逗号运算符用于C中的赋值运算符

时间:2014-06-20 20:39:22

标签: c

#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

3 个答案:

答案 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 ;