编译器在优先级和结合性方面如何解释此表达式?

5

这是来自于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呢?有人能解释一下它被如何解释吗?

3
使用运算符优先级表(例如http://en.cppreference.com/w/cpp/language/operator_precedence)对表达式加上括号,然后重新评估。 - Oliver Charlesworth
1
@OliCharlesworth 我尝试了那个表格,但仍然无法理解发生了什么。 - Yue Wang
2个回答

10
由于逗号运算符的优先级非常低,因此表达式
someValue ? ++x, ++y : --x,--y;

等同于:

(someValue ? ++x, ++y : --x),--y;
因此,表达式++x, ++y被执行(将xy设置为1),然后是末尾的表达式--y,将y恢复为0。

注意 - 逗号运算符引入了一个序列点,因此修改y超过一次不会产生未定义的行为。


4

这个表达式

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

被评估为

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

正如您所看到的,y被修改了两次,一次递增,一次递减,因此结果是1 0而不是1 1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接