逻辑运算符 (
&&
||
) 的从左到右求值是否有保证?
假设我有这个:
SDL_Event event;
if (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
// do stuff
}
}
这保证和这个一样吗?
SDL_Event event;
if (SDL_PollEvent(&event) && event.type == SDL_QUIT) {
// do stuff
}
这也可能非常重要,假设我们有两个要求,
a
和b
。要求 a
比 b
更有可能失败。那么说 if (a && b)
比说 if (b && a)
更有效率。
是的,这是有保证的,否则这样的运算符将失去很多用处。
重要通知:这仅对内置&&
和
||
有效;如果某些犯罪分子重载它们,它们将被视为“常规”重载二元运算符,因此在这种情况下,两个操作数都会被始终评估,并且像往常一样以未指定的顺序进行评估。因此,永远不要超载它们 - 它打破了关于程序控制流的一个非常重要的假设。
&&
和
||
保证短路行为
与§5.15 ¶1
&
不同,&&
保证从左到右求值:如果第一个操作数是false
,则不求值第二个操作数。
与如果重载,它们的行为就像“常规”二元运算符(没有短路或保证评估顺序)
|
不同,||
保证从左到右评估;此外,如果第一个操作数的计算结果为true
,则不会计算第二个操作数。
第 13.5.3 至 13.5.7 款中未明确提及的运算符充当遵守 13.5.1 或 13.5.2 规则的普通一元和二元运算符。和
&&
和
||
在这些子条款中没有明确提及,因此常规 §13.5.2 成立:§13.5.2 ¶1
二元运算符应由具有一个参数的非静态成员函数(9.3)或具有两个参数的非成员函数来实现。因此,对于任何二元运算符没有特殊规定仅评估一侧或按特定顺序评估。
@
,x@y
都可以解释为 作为x.operator@(y)
或operator@(x,y)
。
(所有引用自 C++11 标准)