不,
|=并
&=没有短路,因为它们的复合赋值版本
&和
|等不短路。
[JLS
15.26.2复合赋值运算符](http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.26.2)
形式的复合赋值表达式
E1 op= E2等效于E1 = (T)((E1) op(E2)),其中T是的类型E1,不同之处在于该表达式E1仅被评估一次。
因此,假设
boolean &的等价为
isFoobared &= methodWithSideEffects():
isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit
在另一方面
&&和
||做短路,但令人费解的Java没有为他们复合赋值版本。也就是说,Java既
&&=没有,也没有
||=。
反正这是什么短路业务?
该之间的差异
boolean(逻辑运算符
&和
|)相比,他们的
boolean条件同行(
&&和
||)之处在于前者不“短路”;
后者可以。也就是说,假设没有异常等:
&
并|
始终 评估两个操作数&&
并 有条件地||
评估正确的操作数; 仅当右操作数的值可能影响二进制运算的结果时,才对右操作数进行求值。这意味着在以下情况下不会评估正确的操作数: __- 的左操作数
&&
计算为false
- (因为无论正确的操作数求值是什么,整个表达式都是
false
) - 的左操作数
||
计算为true
- (因为无论正确的操作数求值是什么,整个表达式都是
true
)
- 的左操作数
参考文献
- JLS 15.22.2布尔逻辑运算符
&
,^
和|
- JLS 15.23条件与运算符
&&
- JLS 15.24条件或运算符
||



