我正在调试其中包含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;