31

是否保证逻辑运算符 ( ) 的从左到右求值&& ||

假设我有这个:

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)

4

1 回答 1

48

是的,这是有保证的,否则这样的运算符将失去很多用处。

重要提示:这仅对内置&&有效||;如果某些犯罪分子重载它们,它们将被视为“常规”重载的二元运算符,因此在这种情况下,两个操作数总是被评估,并且像往常一样以未指定的顺序进行。出于这个原因,永远不要让它们超载——它打破了关于程序控制流的一个非常重要的假设。


相关标准报价

内置&&||保证短路行为

§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 标准)

于 2011-04-15T22:40:02.523 回答