Java中是否& =和| =短路?

时间:2010-06-30 18:25:11

标签: java short-circuiting

换句话说,以下两个语句的行为方式是否相同?

isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();

我意识到我可以写一个测试,但有人可能会知道这个,其他人可能会觉得这个答案很有用。

2 个答案:

答案 0 :(得分:37)

不,|=&=没有短路,因为它们是&|的复合分配版本,不会短路。

  

JLS 15.26.2 Compound Assignment Operators

     

E1 op= E2形式的复合赋值表达式等同于E1 = (T)((E1) op (E2)),其中TE1的类型,但E1仅被评估一旦。

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

isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit

另一方面&&||做短路,但莫名其妙地Java没有复合赋值版本。也就是说,Java既没有&&=也没有||=

另见


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

boolean逻辑运算符(&|)与boolean条件对等运算符(&&||)之间的差异是前者不“短路”;后者呢。也就是说,假设没有异常等:

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

参考

答案 1 :(得分:4)

不,他们没有,因为x &= yx = x & y的缩写,x |= yx = x | y的缩写。 Java没有&&=||=运算符可以执行您想要的操作。

&|运营商(以及~^<<>>>>>)是bitwise operators。对于任何整数类型,表达式x & y将执行按位和操作。同样,|执行按位或。要执行按位运算,数字中的每个位都被视为布尔值,1表示true0表示false。因此,3 & 2 == 2,因为30...011二进制且20...010。同样,3 | 2 == 3Wikipedia对不同的运营商有完整的解释。现在,对于一个布尔值,我你可以使用&|作为非短路等价物{{1 }}和&&,但我无法想象你为什么要这么做。