11

给定两个具有&&连接的条件。我知道评估的顺序是从左到右。但是,如果第一个条件解析为 false,那么第二个条件是否保证不会被评估?

#define SIZE
bool array[SIZE];
int index;

// play with variables
// ...

if(index < SIZE && array[index])
{
    // ...
}

在此示例中,如果第一个条件为假,则不得评估第二个条件,因为数组中的访问将超出范围。

顺便说一句,我不能简单地用两个if语句嵌套条件,因为实际上我需要像(!(in_range && get_element)). 使用嵌套语句,我需要使用它goto来跳过下面的代码块。

4

1 回答 1

17

但是,如果第一个条件解析为 false,那么第二个条件是否保证不会被评估?

是的,这就是 C++ 的短路。根据 C++11 标准的第 5.14/1 段:

&&运算符从左到右分组。操作数都根据上下文转换为bool(第 4 条)。结果是true如果两个操作数都是truefalse否则。与 不同&&&保证从左到右的评估:如果第一个操作数是 ,则不评估第二个操作数false

作为马蒂厄姆。在评论中正确提到,以上仅适用于内置的逻辑 AND 和逻辑 OR 运算符:如果这些运算符被重载,则调用它们被视为常规函数调用(因此不应用短路并且不存在评估顺序保证)。

如第 5/2 段所述:

[注意:操作符可以重载,也就是说,当应用于类类型(第 9 条)或枚举类型(7.2)的表达式时,赋予其含义。重载运算符的使用被转换为函数调用,如 13.5 中所述。重载运算符遵循第 5 章中规定的语法规则,但操作数类型、值类别和评估顺序的要求被函数调用规则所取代。[...] —<em>尾注]

于 2013-05-21T09:08:11.073 回答