对于 C ++ 03 ,标准说,&&&&运算符有一个序列点,因此在访问右运算符之前,左运算符的所有副作用都已发生。
所以
int i = 0;
if (++i && i--)
std::cout << i;
定义明确,保证输出0
。
但是这个问题是什么:只有左操作数不是0
时才评估右操作数?它似乎是一个细节,但对我来说,标准只保证操作数之间的序列点,不,从不评估/访问右操作数依赖的左操作数。
E.g。
int arr[10];
int pos; // somehow set to a value from 0 to 10
while (pos < 10 && arr[pos] != 0)
pos++;
这个定义得很好吗? pos
可以从10
开始或到达10
。左操作数具有 no 副作用,这与右操作数一致。我是否保证arr[10] != 0
永远不会被执行?
修改
感谢评论和回答,现在很清楚:
5.14p2: "The result is a bool. If the second expression is evaluated,
every value computation and side effect associated with the first expression
is sequenced before every value computation and side effect associated with
the second expression."
是序列点的含义。
5.14p1: "Unlike &, && guarantees left-to-right evaluation: the second operand is
not evaluated if the first operand is false."
是短路的意思。
没有第二个的第一个将使我的示例未定义。感谢。
答案 0 :(得分:8)
该标准确实可以保证&&
和||
的短路。
如果&&
的左侧是false
,则不评估右侧。对于||
,如果左侧为true
,则不评估右侧。
答案 1 :(得分:5)
5.14p1的C ++ 11,最后一句:
与&amp;,&amp;&amp;保证从左到右的评估:如果第一个操作数为假,则不评估第二个操作数。
是的,这是有保障的。