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

Yar*_*ena 1 java jvm-hotspot bitwise-operators short-circuiting

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

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

Mar*_*ers 6

评估顺序在规范中明确定义:

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

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

另请注意:

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

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

int a = expr1;
int b = expr2;
int result = a & b;
Run Code Online (Sandbox Code Playgroud)