懒惰评估和短路评估之间有什么区别?

时间:2013-02-16 08:45:05

标签: algorithm terminology lazy-evaluation short-circuiting

来自维基百科:

Lazy evaluation 是:

  

在编程语言理论中,懒惰评估或按需调用是   评估策略延迟表达式的评估   直到需要它的价值

Short-circuit evaluation 是:

  

短路评估,最低评估或麦卡锡评估   表示某些编程中某些布尔运算符的语义   仅执行或评估第二个参数的语言   如果第一个参数不足以确定的值   表达

那么它们之间有什么区别,例如我有:

if(false && true && true) {
    //boo
} 

据我所知,编译器不会在false之后执行表达式,因为我有&&所以整个表达式最终都是false。 (对吧?)

这种行为称为懒惰评估短路评估

1 个答案:

答案 0 :(得分:17)

不同之处在于,在延迟评估的情况下,仅在需要时评估表达式,而在短路评估的情况下,表达式评估在您知道结果后立即停止。这是一种正交的概念。

延迟评估可应用于任何计算(短路方案通常仅用于bool)。 它不会切断无用的计算,但会延迟整个计算,直到需要它的结果。

variable = bigAndSlowFunc() or evenSlowerFnc()
if (carry out heavy computations)
  print "Here it is: ", variable
else
  print "As you wish :-)"

如果评估是惰性的,只有当我们选择进入variable的第一个(then)分支时才会计算if,否则不会。在评估阶段(当我们为print准备参数时)可以使用短路方案来决定是否需要调用evenSlowerFnc

所以在你的例子中,它是短路评估,因为没有计算延迟。