Java中&=和| =会短路吗?
换句话说,以下两个语句的行为是否相同?
isFoobared = isFoobared && methodWithSideEffects();isFoobared &= methodWithSideEffects();
我意识到我可以编写一个测试,但是有人可能对此一无所知,而其他人可能会找到有用的答案。
回答:
不,|=并&=没有短路,因为它们的复合赋值版本&和|等不短路。
[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条件或运算符
||
以上是 Java中&=和| =会短路吗? 的全部内容, 来源链接: utcz.com/qa/407170.html
