逻辑AND,OR:是否保证从左到右的评估?

时间:2011-04-15 22:39:20

标签: c++ logical-operators operator-precedence

是否保证对逻辑运算符(&& ||)进行从左到右的评估?

假设我有这个:

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
}

这也非常重要,假设我们有两个要求ab。要求a更有可能失败b。然后说if (a && b)if (b && a)更有效率。

1 个答案:

答案 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标准的所有引文)