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的类型.E1E1
因此,假设boolean &,等价isFoobared &= methodWithSideEffects()是:
isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit
Run Code Online (Sandbox Code Playgroud)
在另一方面&&和||不带有短路,但令人费解的Java没有为他们复合赋值版本.也就是说,Java既没有&&=也没有||=.
该之间的差异boolean(逻辑运算符&和|)相比,他们的boolean条件同行(&&和||)之处在于前者不"带有短路"; 后者呢.也就是说,假设没有异常等:
&并| 始终评估两个操作数&&并有条件地||评估正确的操作数; 只有当其值可能影响二进制操作的结果时,才会评估右操作数.这意味着在以下情况下不评估右操作数:
&&计算结果为false
false)||计算结果为true
true)| 归档时间: |
|
| 查看次数: |
4849 次 |
| 最近记录: |