我现在正在学习 C + + ,这是一本关于 C + + 入门的书,书中的练习之一是:
解释下列表达式的作用:
someValue ? ++x, ++y : --x, --y
我们都知道些什么?我们知道三元运算符比逗号运算符具有更高的优先级。对于二进制运算符,这是很容易理解的,但是对于三进制运算符,我有点纠结。使用二进制运算符“具有较高的优先级”意味着我们可以在优先级较高的表达式周围使用括号,而且它不会改变执行。
For the ternary operator I would do:
(someValue ? ++x, ++y : --x, --y)
有效地导致了同样的代码,这并不能帮助我理解编译器将如何分组代码。
然而,通过使用 C + + 编译器进行测试,我知道这个表达式可以编译,但是我不知道 :
操作符本身可以代表什么。因此,编译器似乎正确地解释了三元运算符。
然后我用两种方法执行了这个程序:
#include <iostream>
int main()
{
bool someValue = true;
int x = 10, y = 10;
someValue ? ++x, ++y : --x, --y;
std::cout << x << " " << y << std::endl;
return 0;
}
结果:
11 10
而另一方面,与 someValue = false
打印:
9 9
为什么 C + + 编译器生成的代码对于三元运算符的 true 分支只递增 x
,而对于三元运算符的 false 分支则同时递减 x
和 y
?
我甚至在真分支前面加上括号,就像这样:
someValue ? (++x, ++y) : --x, --y;
但它仍然导致 11 10
。