编译器如何根据优先级和关联性来解释此表达式?

时间:2014-04-03 05:31:17

标签: c++

这是 C ++ Primer 5th 的练习:

Exercise 4.33: Explain what the following expression does(Page158):
someValue ? ++x, ++y : --x, --y

代码:

bool someVlaue = 1;
int x = 0;
int y = 0;
someVlaue ? ++x, ++y : --x,--y;
std::cout << x << std::endl << y << std::endl;

我尝试了Gcc4.81Clang3.5,两人都给了我:

1
0
Press <RETURN> to close this window...

为什么不11?谁能解释它是如何被解释的?

2 个答案:

答案 0 :(得分:9)

由于逗号运算符的优先级非常低,因此表达式

someValue ? ++x, ++y : --x,--y;

相当于:

(someValue ? ++x, ++y : --x),--y;

执行++x, ++y表达式(将xy设置为1),然后在结尾处使用表达式--y,将y恢复为0

注意 - 逗号运算符引入了一个序列点,因此多次修改y没有未定义的行为。

答案 1 :(得分:3)

表达式

someValue ? ++x, ++y : --x, --y

评估为

(someValue ? ((++x), (++y)) : (--x)), (--y)

如您所见,y被修改两次,一旦递增并递减一次,因此结果为1 0而不是1 1