Java中的按位AND(&)表达式

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

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

评估订单在规范中定义明确 :

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

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

另请注意:

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

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

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

JLS第3版第15.7节讨论了从左到右的评估顺序,但要求不要过分依赖它(短路除外)