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

回到顶部