有短路倍增这样的东西吗?

时间:2011-11-16 02:27:51

标签: language-agnostic short-circuiting arithmetic-expressions

我们都知道逻辑表达式中的短路,即何时

if ( False AND myFunc(a) ) then
...

不会执行myFunc(),因为if条件无法成真。

我很好奇是否有相应的日常代数方程式,比如说

result = C*x/y + z

如果C=0评估第一个学期没有意义。如果xy是标量,那么在性能方面并不重要,但如果我们假装它们是大型矩阵并且操作成本高昂(并且适用于矩阵)那么肯定会有所作为。当然,您可以通过投入if C!=0声明来避免这种极端情况。

所以我的问题是这样的功能是否存在以及它是否有用。我不是一个程序员,所以它可能以某种名义,我没有遇到过;如果是的话请赐教:)

2 个答案:

答案 0 :(得分:6)

您所谈论的概念采用不同的名称:懒惰评估非严格评估按需调用,命名为很少,实际上比在这里和那里避免乘法要强大得多。

HaskellFrege等编程语言,其评估模型不严格。在那里编写“短路”乘法运算符非常容易,例如你可以编写类似的东西:

infixl 7 `*?`        -- tell compiler that ?* is a left associative infix operator
                     -- with precedence 7 (like the normal *)

0 *? x = 0           -- do not evaluate x
y *? x = y * x       -- fall back to standard multiplication

答案 1 :(得分:1)

如果数据很大和/或很复杂并且操作成本很高,那么操作的实现应该在进行昂贵的操作之前执行适当的快捷方式检查。它是运算符实现的内部细节(比如矩阵*),但实际上与“乘法”的语言概念无关,对你编写计算的方式影响不大。