给出两个&&
连接的条件。我知道评估的顺序是从左到右。但是如果第一个条件解析为false,那么第二个条件是否可以保证不被评估?
#define SIZE
bool array[SIZE];
int index;
// play with variables
// ...
if(index < SIZE && array[index])
{
// ...
}
在此示例中,如果第一个条件为false,则不能对第二个条件进行求值,因为数组中的访问将超出范围。
顺便说一下,我不能简单地用两个if
语句嵌套条件,因为实际上我需要像(!(in_range && get_element))
那样的逆。使用嵌套语句,我需要使用goto
跳过下面的代码块。
答案 0 :(得分:15)
但如果第一个条件解析为false,那么第二个条件是否可以保证不被评估?
是的,这是C ++的短路。根据C ++ 11标准的第5.14 / 1段:
&&
运算符组从左到右。操作数都在上下文中转换为bool
(第4条)。 如果两个操作数分别为true
和true
,则结果为false
。与&
不同,&&
保证从左到右 评估:如果第一个操作数为false
,则不评估第二个操作数。
As MatthieuM. correctly mentions in the comments,上面只适用于内置的逻辑AND和逻辑OR运算符:如果这些运算符被重载,调用它们将被视为常规函数调用(因此不应用短路并且不执行命令评估得到保证)。
如第5/2段所述:
[注意:操作符可以重载,也就是说,当应用于类类型的表达式时给定含义(子句) 9)或枚举类型(7.2)。 如上所述,重载运算符的使用将转换为函数调用 在13.5。重载运算符遵循第5章中规定的语法规则,但要求符合 操作数类型,值类别和评估顺序由函数调用规则替换。 [...] - 结束记录]