7

我们都知道在逻辑表达式约短路时,即当是否有短路倍增这样的事情?

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

不打扰执行myFunc(),因为没有办法的if条件可以实现的。

我很好奇是否有日常代数方程的等价,说

result = C*x/y + z 

如果C=0有评估的第一项是没有意义的。如果xy是标量,那么性能方面并不重要,但如果我们假设它们是大矩阵并且操作代价昂贵(并且适用于矩阵),那么肯定会产生差异。当然你可以通过投入if C!=0声明来避免这种极端情况。

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

+1

逻辑短路是从功能的角度来看一个重要的概念,而“算术短路”是只是在编译器级别进行优化而没有功能差异。你的选择语言可能已经在幕后做了,而你没有注意到。 – deceze

+2

知道比我更多的人应该回答,但我想你会遇到问题,如果你短暂的分裂。例如,如果y = 0,会发生什么?如果短路,那么当答案实际上是错误时它将返回0。 – Nate

+0

@deceze正如逻辑短路一样,算术短路的确会有超越优化的功能差异。考虑'result = C * myfunction()'。如果'C == 0'导致算术表达式短路,那么'myfunction'永远不会被调用,并且不会发生任何副作用(就像逻辑短路一样)。 –

回答

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 
+0

谢谢!接受回答一些后续问题。 – Verge

1

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

相关问题