【发布时间】:2018-05-12 08:13:48
【问题描述】:
我目前正在通过《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。
【问题讨论】:
-
“优先级”只是 C++ 中的一种新兴现象。直接看语言语法,看看表达式是如何工作的,可能会更简单。
-
我们不太关心这些原则。 :-) 你必须在这里问这个事实表明代码永远不会通过你的程序员同事的代码审查。这使得关于这个实际上如何工作的知识变得不那么有用了。当然,除非你想参加Obfuscated C Contest。
-
@BoPersson 没有这样的例子可以学习,未来的审稿人永远不会知道为什么他们应该从生产中拒绝这个。
-
@Leushenko - 警钟无论如何都应该响起。同一语句中的多个增量和减量(叮、叮、叮!)。可以使用 if-else 的三元运算符(叮、叮、叮!)。等等,那些逗号是可怕的逗号运算符吗? (叮,叮,叮!)所有这些运算符,可以有一些优先权吗? (叮,叮,叮!)所以我们永远无法使用它。那为什么还要浪费时间弄清楚它的作用呢?
-
次要问题:
?的名称是 条件运算符。术语三元运算符仅表示具有三个操作数的运算符。条件运算符是三元运算符的一个示例,但一种语言(理论上)可以有多个三元运算符。
标签: c++ language-lawyer operator-precedence conditional-operator