为什么算术表达式没有在C#中乘以0进行优化

Rob*_*rto 1 c# expression programming-languages compiler-optimization

为了评估乘法,你必须评估第一个术语,然后是第二个术语,最后将两个值相乘.

假设每个乘以0的数字为0,如果第一项的评估返回0,我将期望在不评估第二项的情况下将整个乘法计算为0.

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

var x = 0 * ComplexOperation();
Run Code Online (Sandbox Code Playgroud)

尽管我们知道x是0,但函数ComplexOperation被调用.

优化的行为也与布尔运算符'&&'一致,仅当第一项被评估为真时才计算第二项.('&'运算符在任何情况下都会评估这两个术语)

我测试了这种行为,C#但我猜几乎所有语言都是一样的.

Oli*_*rth 15

首先,对于浮点,你的断言甚至都不是真的!考虑0 * inf不是0,而0 * nan不是0.

但更一般地说,如果你在谈论优化,那么我想编译器可以自由地评估ComplexOperation它是否可以证明没有副作用.

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


Suz*_*ioc 6

C#不起作用,因此功能可能有副作用.例如,您可以从内部打印某些内容ComlpexOperation或更改全局静态变量.因此,它是否被调用是由*合同定义的.

你发现自己有不同的合同的例子&&&.