Java中有&=和| =短路?

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)),where T的类型.E1E1

因此,假设boolean &,等价isFoobared &= methodWithSideEffects()是:

isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit
Run Code Online (Sandbox Code Playgroud)

在另一方面&&||不带有短路,但令人费解的Java没有为他们复合赋值版本.也就是说,Java既没有&&=也没有||=.

也可以看看


这个短路业务究竟是什么?

该之间的差异boolean(逻辑运算符&|)相比,他们的boolean条件同行(&&||)之处在于前者不"带有短路"; 后者呢.也就是说,假设没有异常等:

  • &| 始终评估两个操作数
  • &&有条件地||评估正确的操作数; 只有当其值可能影响二进制操作的结果时,才会评估右操作数.这意味着在以下情况下不评估右操作数:
    • 左操作数的&&计算结果为false
      • (因为无论右操作数的计算结果如何,整个表达式都是false)
    • 左操作数的||计算结果为true
      • (因为无论右操作数的计算结果如何,整个表达式都是true)

参考