dan*_*jar 6 c++ if-statement execution boolean-expression operator-precedence
给出两个&&连接条件.我知道评估的顺序是从左到右.但是如果第一个条件解析为false,那么第二个条件保证不会被评估?
#define SIZE
bool array[SIZE];
int index;
// play with variables
// ...
if(index < SIZE && array[index])
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,如果第一个条件为false,则不能评估第二个条件,因为数组中的访问将超出范围.
顺便说一句,我不能简单地用两个if语句嵌套条件,因为实际上我需要反向像(!(in_range && get_element)).使用嵌套语句,我需要用goto它跳过下面的代码块.
And*_*owl 15
但是如果第一个条件解析为false,那么第二个条件保证不会被评估?
是的,这是C++的短路.根据C++ 11标准的第5.14/1段:
在
&&左到右操作员组.操作数都在上下文中转换为bool(第4条).结果是true两个操作数都是true和false否则.不像&,&&保证左到右的评价:如果第一个操作数是不计算第二个操作数false.
作为MatthieuM.正确地在注释中提到,上面只适用于内置的逻辑AND和逻辑OR运算符:如果这些运算符被重载,则调用它们被视为常规函数调用(因此不应用短路并且没有评估顺序是保证).
如第5/2段所述:
[ 注意:操作符可以重载,也就是说,当应用于类类型(第9节)或枚举类型(7.2)的表达式时,它们具有意义.重载运算符的使用将转换为函数调用,如13.5中所述.重载运算符遵循第5章中指定的语法规则,但操作数类型,值类别和评估顺序的要求将替换为函数调用的规则.[...] - 结束说明 ]
| 归档时间: |
|
| 查看次数: |
1988 次 |
| 最近记录: |