【发布时间】:2014-11-01 18:31:21
【问题描述】:
这是一个例子
#include <iostream>
using namespace std;
int main()
{
int x = 0;
cout << (x == 0 ? x++ : x) << endl; //operator in branch
cout << "x=" << x << endl;
cout << (x == 1 || --x == 0 ? 1 : 2) << endl; //operator in condition
cout << "x=" << x << endl;
return 0;
}
输出:
0
x=1
1
x=1
我理解输出,但 这是未定义的行为吗?在这两种情况下都保证评估顺序吗?
即使有保证,我也很清楚使用增量/减量很快就会成为可读性问题。我只是在看到类似的代码并且立即不确定时才问,因为有很多模棱两可/未定义使用递增/递减运算符的示例,例如...
【问题讨论】:
-
相关(不重复):stackoverflow.com/questions/10995445/… - 描述分配回递增变量的特殊情况。
-
注意:定义明确只是一个问题。可维护是另一个。如果你不得不问我们,下一个阅读该代码的人如何确保它是安全的? “真正的作家重写以避免问题。”
-
main()的第 4 行中的减量运算符在此示例中无关紧要,因为||的短路行为将导致--x被完全跳过。 -
@JLRishe 实际上问题在于它:是否保证短路以使
--x永远不会被评估? (下面回答) -
@jozxyqk 好的,但在这种情况下,它与三元/条件运算符无关,与
||运算符有关。x == 1 || --x == 0在条件运算符参与之前已被完全评估,到那时,--x将被跳过。换句话说,第 4 行没有告诉我们任何关于条件运算符的重要信息。
标签: c++ c increment ternary-operator decrement