给定两个条件&&
联系。我知道评估的顺序是从左到右。但是,如果第一个条件解析为 false,那么第二个条件是否保证不会被评估?
#define SIZE
bool array[SIZE];
int index;
// play with variables
// ...
if(index < SIZE && array[index])
{
// ...
}
在此示例中,如果第一个条件为 false,则不得评估第二个条件,因为数组中的访问将超出范围。
顺便说一句,我不能简单地用两个嵌套条件if
陈述,因为实际上我需要像这样的逆(!(in_range && get_element))
。对于嵌套语句,我需要使用goto
跳过下面的代码块。
但是,如果第一个条件解析为 false,那么第二个条件是否保证不会被评估?
是的,这就是C++的短路。根据 C++11 标准第 5.14/1 段:
The &&
运算符组从左到右。操作数都根据上下文转换为bool
(第 4 条)。
结果是true
如果两个操作数都是true
and false
否则。不像&
, &&
保证从左到右
评估:如果第一个操作数是,则不计算第二个操作数false
.
正如马修 M.评论中正确提及,上述内容仅适用于内置逻辑 AND 和逻辑 OR 运算符:如果这些运算符被重载,则调用它们将被视为常规函数调用(因此不适用短路,并且不保证计算顺序)。
如第 5/2 段所述:
[Note:运算符可以重载,即在应用于类类型的表达式时赋予含义(子句
9) 或枚举类型(7.2)。重载运算符的使用被转换为函数调用,如下所述
在 13.5 中。重载运算符遵守第 5 条中指定的语法规则,但要求
操作数类型、值类别和计算顺序被函数调用规则取代。 [...]——end note ]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)