C ++延迟评估布尔值或函数调用表达式

时间:2013-11-18 02:16:17

标签: c++ lazy-evaluation

快速提问,在c ++中,这个表达式被懒惰地评估了吗?

bool funca();
bool funcb();

funca() || funcb(); // line in question

显然,这(可能)仅仅是以下内容的简写:

bool funca();
bool funcb();

if (!funca()) {
    funcb();
}

// or even more concisely:

if (!funca()) funcb();

我希望c ++会评估那条原始行吗?感谢。

3 个答案:

答案 0 :(得分:11)

在C / C ++中,逻辑运算符短路。在a || b如果a为真b未评估,则a && b如果a为假,则b未评估。

小心:这只发生在&&||,而不是|&

答案 1 :(得分:4)

它被称为short-circuit evaluation。但是,是的 - 关于“||”它是懒惰的,因为如果条件必须求值为真,那么它就会停止(例如,如果a为真,则(a || b)不会计算b)。和“&&”类似因为如果(a&& b)其中a是假b则不被评估。

答案 2 :(得分:2)

没有。延迟评估意味着仅在需要包含子表达式的表达式时才评估子表达式。由于您放弃了完整表达式的结果,因此延迟评估将评估

如果你写过writeBoolean(funcA() || funcB());懒惰的评估会评估funcA(),因为这肯定是必要的,可能还有funcB。

但这不是C ++的工作原理; C ++没有懒惰的评估。即使您丢弃表达式的结果,它仍然会被评估。您进行短路评估。是否调用funcB不依赖于使用完整表达式,但它取决于funcA的结果。