是否保证不会对 if 语句进行不必要的评估? [复制]
Posted
技术标签:
【中文标题】是否保证不会对 if 语句进行不必要的评估? [复制]【英文标题】:Is an if statement guaranteed to not be evaluated more than necessary? [duplicate] 【发布时间】:2013-05-15 23:47:25 【问题描述】:给定&&
连接的两个条件。我知道评估的顺序是从左到右。但是,如果第一个条件解析为 false,那么第二个条件是否保证不会被评估?
#define SIZE
bool array[SIZE];
int index;
// play with variables
// ...
if(index < SIZE && array[index])
// ...
在此示例中,如果第一个条件为假,则不得评估第二个条件,因为数组中的访问将超出范围。
顺便说一句,我不能简单地用两个if
语句嵌套条件,因为实际上我需要像(!(in_range && get_element))
这样的逆语句。对于嵌套语句,我需要使用 goto
来跳过下面的代码块。
【问题讨论】:
这与 if 语句几乎没有关系。 if 语句也只执行一次,但您要问的实际上是&&
operator 的行为。
如果标签和问题标题更符合实际问题,请随意编辑。
虽然最精确的副本是上面的那个,但这里的答案更好:***.com/questions/5683026/…,以及这里:***.com/questions/628526/…
【参考方案1】:
但是,如果第一个条件解析为 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 章中规定的语法规则,但 操作数类型、值类别和评估顺序被函数调用规则替换。 [...] —尾注 ]
【讨论】:
注意:这仅适用于内置的and
和or
运算符;如果您使用自定义类型重载 and
或 or
,则适用常规函数评估规则。
@MatthieuM.:正确,谢谢您提及以上是关于是否保证不会对 if 语句进行不必要的评估? [复制]的主要内容,如果未能解决你的问题,请参考以下文章