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节讨论了从左到右的评估顺序,但要求不要过分依赖它(短路除外)