C++布尔值或函数调用表达式的惰性计算

C++ lazy evaluation of boolean or in function call expression

本文关键字:计算 表达式 布尔值 函数调用 C++      更新时间:2023-10-16

快速问题,在 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++ 会像我希望的那样评估有问题的原始行吗?谢谢。

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

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

这称为短路评估。但是,是的 - 关于"||",它是懒惰的,因为如果条件必须计算为 true,那么它就会停止(例如,如果 (a || b) 如果 a 为真,则不会计算 b)。与"&&"类似,如果(a&&b)其中a为假b不被计算。

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

如果你写了writeBoolean(funcA() || funcB());惰性求值就会计算funcA(),因为这绝对是必要的,而且可能是funcB。

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