【问题标题】:C++ lazy evaluation of boolean or in function call expression布尔值或函数调用表达式的 C++ 惰性求值
【发布时间】:2013-11-18 02:16: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++ lazy-evaluation


    【解决方案1】:

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

    小心:这只会发生在 &&|| 上,不会发生在 |& 上。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        没有。惰性求值意味着只有在需要包含它的表达式时才对子表达式求值。由于您丢弃了完整表达式的结果,因此惰性求值将评估 nothing

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

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

        【讨论】:

          猜你喜欢
          • 2011-05-12
          • 2010-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多