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

Afs*_*ani 17 algorithm terminology lazy-evaluation short-circuiting

来自维基百科:

懒惰的评价是:

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

短路评估是:

短路评价,最小评估,或麦卡锡评价表示在将第二个参数时,才执行或评价一些编程语言一些布尔运算符的语义如果第一参数不足以确定表达式的值

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

if(false && true && true) {
    //boo
} 
Run Code Online (Sandbox Code Playgroud)

据我所知,编译器之后不会执行表达式,false因为我已经完成&&了整个表达式false.(对?)

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

Art*_*lev 18

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

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

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

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

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

  • 正如第一句话所说,在惰性求值中,只有在需要值时才计算表达式.因此,如果永远不需要表达式的值,则永远不会计算表达式.考虑`f()&& g()`; 当需要这个表达式的值时,如果`f()`求值为'true`,`g()`的值的计算将被延迟,直到需要它为止.此外,除非需要,否则根本不计算`g()`.短路评估是惰性评估的一个简单案例. (3认同)
  • 您已经重申了我的观点,“g()”的评估会被延迟,直到需要时为止。这是惰性求值(对于正确的操作数)。这恰好发生在“f()”被评估为“true”之后,但那又怎样呢?将其与“E & F”进行对比,其中评估模型(在 C 中)是评估“E”和“F”,然后(按位)“与”。Java 有点不同,强制从左到右计算操作数,但那又怎样呢?考虑 Haskell 前奏中 && 的定义 `{True && x = x ; 假&& _ = 假}`。这与 C 的 && 完全相同,因为 Haskell 使用惰性求值。 (2认同)