我目前正在使用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
。
?
是条件运算符。术语三元运算符仅表示具有三个操作数的运算符。条件运算符是三元运算符的一个示例,但是一种语言可以(理论上)具有多个三元运算符。