我想知道Java虚拟机是否避免了零乘法。感谢
答案 0 :(得分:2)
根据Java Language Spec,“操作符的每个操作数(除了条件运算符&&,||和?:)似乎在执行操作本身的任何部分之前被完全评估。 “
因此,即使编译器或运行时可以检测到一个因子为零,如果另一个因子可能有副作用,它仍然必须评估另一个因子。
答案 1 :(得分:1)
没有要求虚拟机这样做,一般来说我不会期望这样的事情;但虚拟机可以进行任何不会影响线程可观察行为的优化,因此它是完全合法的。
我认为,更有可能的是,如果编译器能够在编译时检测到其中一个操作数保证为零,那么编译器将优化掉乘法。在这种情况下,乘法将在它到达虚拟机之前很久就被删除。
答案 2 :(得分:1)
值得注意的是,乘以0并不总是为0。对于无穷大和NaN,乘以0得到NaN。
javac编译器将优化常量表达式。如果编译器可以确定结果始终是固定值,则它在编译时执行计算。
HotSpot编译器非常擅长优化无法执行任何操作的代码。这并不意味着它可以优化您可以想象的所有可能的东西,只是它可以检测到的常见用例并且乘以零可能会也可能不会是其中之一。它也可能因JVM实现而异。总之,你不应该依赖它。