是从左到右计算逻辑运算符 (&&
||
)有保证吗?
假设我有这个:
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
and b
。要求a
那么失败的可能性就大得多b
。那么这样说就更有效率了if (a && b)
than if (b && a)
.
是的,这是有保证的,否则这样的运算符将失去很多用处。
重要的提醒: 这是有效的only对于内置的&&
and ||
;如果某些犯罪分子重载它们,它们将被视为“常规”重载二元运算符,因此在这种情况下both操作数是always评估,并像往常一样按未指定的顺序进行。因此,永远不要让它们过载——它破坏了关于程序控制流的一个非常重要的假设。
相关标准报价
Builtin &&
and ||
有保证的短路行为
§5.14 ¶1
Unlike &
, &&
保证从左到右求值:如果第一个操作数是,则不求值第二个操作数false
.
§5.15 ¶1
Unlike |
, ||
保证从左到右的评估;此外,如果第一个操作数的计算结果为,则不会计算第二个操作数true
.
如果重载,它们的行为就像“常规”二元运算符(没有短路或保证评估顺序)
§13.5 ¶9
第 13.5.3 至 13.5.7 款中未明确提及的运算符充当遵守 13.5.1 或 13.5.2 规则的普通一元和二元运算符。
and &&
and ||
这些子条款中没有明确提及,因此常规 §13.5.2 成立:
§13.5.2 ¶1
二元运算符应由具有一个参数的非静态成员函数 (9.3) 或具有两个参数的非成员函数来实现。因此,对于任何二元运算符@
, x@y
可以解释为
作为任一x.operator@(y)
or operator@(x,y)
.
没有专门规定仅评估一侧或按特定顺序评估。
(所有引用均来自 C++11 标准)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)