【发布时间】:2011-03-21 18:39:32
【问题描述】:
我正在调试其中包含expr1 & expr2 的代码,其中expr1 具有影响expr2 评估结果的副作用。我怀疑expr2 在expr1 之前被评估,因为JLS 保证&& 的从左到右评估,但不一定是&。我还怀疑评估顺序的变化可能是 HotSpot 执行优化的结果(我们正在运行 Java 6u20)。不知道HotSpot能不能做这样的优化?更好的是,提供任何指向支持或消除怀疑的文档的指针。提前致谢。
编辑:感谢那些建议重写代码,使其既正确又可读 - 你是对的,但我已经这样做了,所以这不是我想要的。不幸的是,很难测试这种变化,这就是我在这里问这个问题的原因。
【问题讨论】:
-
为什么不把
if (A() & B())变成boolean a = A(); boolean b = B(); if (a & b)看看能不能解决问题? -
是什么让您认为按位不能保证从左到右?我在规范中可以找到的唯一区别是,对于按位,
expr2保证会被评估,但对于逻辑它会被短路,但在任何一种情况下,它总是 L->R,并且 @ 987654332@ 的操作数将在expr2的任何部分之前计算。 -
download-llnw.oracle.com/javase/tutorial/java/nutsandbolts/… 声明除了赋值之外的所有二元运算符都是从左到右计算的。
-
是否绝对有必要产生副作用?一般来说,这是一个坏主意。
expr1; expr2; expr1Result & expr2Result;会好很多,并且会避免此类问题。 -
@Joe 只有短路逻辑二元运算符可以(并且必须短路)。即
&&和||做;&、|、^/!=和==不要。
标签: java bitwise-operators jvm-hotspot short-circuiting