为了评估乘法,您必须评估第一个项,然后评估第二个项,最后将两个值相乘。

给定每个乘以0的数字均为0,如果第一项的求值返回0,则我希望整个乘法的计算结果为0,而不计算第二项。

但是,如果您尝试此代码:

var x = 0 * ComplexOperation();


尽管我们知道x为0,但仍调用了ComplexOperation函数。

优化的行为也将与布尔运算符“ &&”一致,布尔运算符“ &&”仅在第一个条件被评估为true时才评估第二个条件。 (在任何情况下,“&”运算符都会对两个术语进行求值)

我在C#中测试了此行为,但我猜几乎所有语言都一样。

最佳答案

首先,对于浮点,您的主张甚至都不成立!考虑0 * inf不是0,并且0 * nan不是0。

但是更笼统地说,如果您正在谈论优化,那么我猜编译器可以自由地不评估ComplexOperation,如果它可以证明没有副作用。

但是,我认为您实际上是在谈论短路语义(即语言功能,而不是编译器功能)。如果是这样,那么真正的理由就是C#正在复制早期语言(最初为C)的语义以保持一致性。

08-06 20:09