是否保证对逻辑运算符(&&
||
)进行从左到右的评估?
假设我有这个:
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)
更有效率。
答案 0 :(得分:42)
是的,它是有保证的,否则这些运营商会失去很多用处。
重要提示 :这对于内置&&
和||
有效 ;如果某些犯罪分子超载它们,则将它们视为“常规”重载二元运算符,因此在这种情况下,两个操作数都始终评估,并且通常以未指定的顺序。出于这个原因,永远不要超载它们 - 它打破了关于程序控制流程的一个非常重要的假设。
&&
和||
保证了短路行为§5.14¶1
与
&
不同,&&
保证从左到右评估:如果第一个操作数为false
,则不评估第二个操作数。
§5.15¶1
与
|
不同,||
保证从左到右的评估;此外,如果第一个操作数的计算结果为true
,则不计算第二个操作数。
§13.5¶9
子条款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标准的所有引文)