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