我正在调试其中包含expr1 & expr2的代码,其中expr1具有影响expr2评估结果的副作用。我怀疑在expr2之前得到评估,因为JLS保证了expr1的从左到右评估,但不一定是&&的评估。我还怀疑评估顺序的更改可能是HotSpot(我们正在运行Java 6u20)进行优化的结果。您知道HotSpot是否可以进行这种优化吗?更好的是,提供任何支持或消除怀疑的文档指针。提前致谢。

编辑:感谢那些建议重写代码的建议,使它既正确又可读-您是对的,但是我已经做到了,所以这不是我想要的。不幸的是,很难测试更改,这就是为什么我在这里问这个问题。

最佳答案

评估顺序已在specification中明确定义:


  Java编程语言保证运算符的操作数似乎按照特定的评估顺序(即从左到右)进行评估。


如果HotSpot优化器更改了结果,则不应进行导致在expr1之前评估expr2的优化。如果这样做,那就是一个错误。

另请注意它说:


  建议代码不要严格依赖此规范。


您的代码可以更清晰地重写如下:

int a = expr1;
int b = expr2;
int result = a & b;

10-08 09:33