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

eat*_*hil 13 c++ lazy-evaluation

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

bool funca();
bool funcb();

funca() || funcb(); // line in question
Run Code Online (Sandbox Code Playgroud)

显然这是(可能)只是以下的简写:

bool funca();
bool funcb();

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

// or even more concisely:

if (!funca()) funcb();
Run Code Online (Sandbox Code Playgroud)

c ++会不会评估原来的那条线,因为我希望它会?谢谢.

Mih*_*eac 17

在C/C++中,逻辑运算符短路.在a || b如果a是真的b没有评估和a && b,如果a是假的b不计算.

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


Ell*_*sch 6

这称为短路评估。但是,是的-对于“ ||”而言,这是很懒的,因为如果条件必须评估为true,那么它将停止(例如,如果(a || b)如果a为true,则不会评估b)。并且与“ &&”类似,因为如果(a && b)其中a为假,则不会评估b。


MSa*_*ers 5

不会。惰性求值意味着仅当需要包含子表达式的表达式时才求值。由于您丢弃了完整表达式的结果,因此惰性求值不会计算任何内容

如果您编写了writeBoolean(funcA() || funcB());惰性求值,则会对 funcA() 求值,因为这绝对是必要的,而且可能还对 funcB 求值。

但这不是 C++ 的工作原理。C++ 没有惰性求值。即使您丢弃表达式的结果,它仍然会被计算。您确实得到了短路评估。是否funcB被调用并不取决于完整表达式的使用,但它取决于 的结果funcA