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

orl*_*rlp 27 c++ operator-precedence logical-operators

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

假设我有这个:

SDL_Event event;

if (SDL_PollEvent(&event)) {
    if (event.type == SDL_QUIT) {
            // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

这保证与此相同吗?

SDL_Event event;

if (SDL_PollEvent(&event) && event.type == SDL_QUIT) {
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

这也很重要,假设我们有两个要求,a并且b.因此,要求a更有可能失败b.然后说它if (a && b)比说更有效率if (b && a).

Mat*_*lia 43

是的,它是有保证的,否则这样的运营商会失去很多用处.

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


相关标准报价

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

§5.141

不像&,&&保证左到右的评价:如果第一个操作数是不计算第二个操作数false.

§5.151

不同于|,||保证从左到右的评估; 此外,如果第一个操作数的计算结果为,则不计算第二个操作数true.

如果过载,它们表现为"常规"二进制运算符(没有短路或保证评估顺序)

§13.59

子条款13.5.3至13.5.7中未明确提及的运算符作为遵守13.5.1或13.5.2规则的普通一元和二元运算符.

&&||未在这些小节中明确地提到,所以定期§13.5.2成立:

§13.5.21

二元运算符应由具有一个参数的非静态成员函数(9.3)或具有两个参数的非成员函数实现.因此,对于任何二元运算符@,x@y可以解释为x.operator@(y)或者operator@(x,y).

没有特别规定只评估一方或特定顺序.

(来自C++ 11标准的所有引文)