Jus*_*n K 33 java short-circuiting
换句话说,以下两个语句的行为方式是否相同?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
Run Code Online (Sandbox Code Playgroud)
我意识到我可以写一个测试,但有人可能会知道这个,其他人可能会觉得答案很有用.
pol*_*nts 38
不,|=
并且&=
不要短路,因为它们是和的复合分配版本,&
并且|
没有短路.
JLS 15.26.2复合赋值运算符
除了仅计算一次之外,表单的复合赋值表达式
E1 op= E2
等效于E1 = (T)((E1) op (E2))
,whereT
的类型.E1
E1
因此,假设boolean &
,等价isFoobared &= methodWithSideEffects()
是:
isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit
Run Code Online (Sandbox Code Playgroud)
在另一方面&&
和||
不带有短路,但令人费解的Java没有为他们复合赋值版本.也就是说,Java既没有&&=
也没有||=
.
该之间的差异boolean
(逻辑运算符&
和|
)相比,他们的boolean
条件同行(&&
和||
)之处在于前者不"带有短路"; 后者呢.也就是说,假设没有异常等:
&
并|
始终评估两个操作数&&
并有条件地||
评估正确的操作数; 只有当其值可能影响二进制操作的结果时,才会评估右操作数.这意味着在以下情况下不评估右操作数:
&&
计算结果为false
false
)||
计算结果为true
true
) 归档时间: |
|
查看次数: |
4849 次 |
最近记录: |