是否保证不会对 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 &amp;&amp; get_element)) 这样的逆语句。对于嵌套语句,我需要使用 goto 来跳过下面的代码块。

【问题讨论】:

这与 if 语句几乎没有关系。 if 语句也只执行一次,但您要问的实际上是&amp;&amp; operator 的行为。 如果标签和问题标题更符合实际问题,请随意编辑。 虽然最精确的副本是上面的那个,但这里的答案更好:***.com/questions/5683026/…,以及这里:***.com/questions/628526/… 【参考方案1】:

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

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

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

As MatthieuM. correctly mentions in the comments,以上仅适用于内置的逻辑 AND 和逻辑 OR 运算符:如果这些运算符被重载,则调用它们将被视为常规函数调用(因此不应用短路且不存在求值顺序有保证)。

如第 5/2 段所述:

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

【讨论】:

注意:这仅适用于内置的andor 运算符;如果您使用自定义类型重载 andor,则适用常规函数评估规则。 @MatthieuM.:正确,谢谢您提及

以上是关于是否保证不会对 if 语句进行不必要的评估? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

安全评估与动态检测技术

安全评估与动态检测技术

如果 IF 语句不满足第一个条件,它会停止评估吗?

JavaScript IF 语句错误地评估 TRUE - 为啥?

在 C++ 中如何评估 if 语句?

在变量赋值powershell中执行if语句