为了评估乘法,您必须评估第一个项,然后评估第二个项,最后将两个值相乘。
给定每个乘以0的数字均为0,如果第一项的求值返回0,则我希望整个乘法的计算结果为0,而不计算第二项。
但是,如果您尝试此代码:
var x = 0 * ComplexOperation();
尽管我们知道x为0,但仍调用了ComplexOperation函数。
优化的行为也将与布尔运算符“ &&”一致,布尔运算符“ &&”仅在第一个条件被评估为true时才评估第二个条件。 (在任何情况下,“&”运算符都会对两个术语进行求值)
我在
C#
中测试了此行为,但我猜几乎所有语言都一样。 最佳答案
首先,对于浮点,您的主张甚至都不成立!考虑0 * inf
不是0,并且0 * nan
不是0。
但是更笼统地说,如果您正在谈论优化,那么我猜编译器可以自由地不评估ComplexOperation
,如果它可以证明没有副作用。
但是,我认为您实际上是在谈论短路语义(即语言功能,而不是编译器功能)。如果是这样,那么真正的理由就是C#正在复制早期语言(最初为C)的语义以保持一致性。