我正在使用C++ Primer这本书学习C++,其中的一个练习是:
解释以下表达式的含义:
someValue ? ++x, ++y : --x, --y
我们知道,三目运算符的优先级高于逗号运算符。对于二元运算符,这相当容易理解,但对于三目运算符,我有些困惑。对于二元运算符,“优先级更高”意味着我们可以在具有更高优先级的表达式周围使用括号,并且它不会改变执行顺序。
对于三目运算符,我会这样做:
(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++编译器生成的代码在三元运算符的真分支中只增加 x
,而在假分支中减少了 x
和 y
?
我甚至已经在真分支周围加上括号,就像这样:
someValue ? (++x, ++y) : --x, --y;
但结果仍为11 10
。
?
的名称是条件运算符。术语三元运算符仅表示具有三个操作数的运算符。条件运算符是三元运算符的一个例子,但一种语言理论上可以有多个三元运算符。 - bta