if语句是否保证不被评估超过必要的?

时间:2013-05-21 09:07:31

标签: c++ if-statement execution boolean-expression operator-precedence

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

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

// play with variables
// ...

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

在此示例中,如果第一个条件为false,则不能对第二个条件进行求值,因为数组中的访问将超出范围。

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

1 个答案:

答案 0 :(得分:15)

  

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

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

  

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

As MatthieuM. correctly mentions in the comments,上面只适用于内置的逻辑AND和逻辑OR运算符:如果这些运算符被重载,调用它们将被视为常规函数调用(因此不应用短路并且不执行命令评估得到保证)。

如第5/2段所述:

  

[注意:操作符可以重载,也就是说,当应用于类类型的表达式时给定含义(子句)   9)或枚举类型(7.2)。 如上所述,重载运算符的使用将转换为函数调用   在13.5。重载运算符遵循第5章中规定的语法规则,但要求符合   操作数类型,值类别和评估顺序由函数调用规则替换。 [...] - 结束记录]