39

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

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

我意识到我可以写一个测试,但有人可能会立即知道这一点,而其他人可能会发现答案很有用。

4

2 回答 2

45

不,|=并且&=不要短路,因为它们是 and 的复合赋值版本,&不会|短路。

JLS 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逻辑运算符 ( &and |) 与boolean条件运算符 ( &&and )的区别在于||前者不会“短路”;后者做。也就是说,假设没有例外等:

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

参考

于 2010-06-30T18:26:25.210 回答
4

不,他们没有,因为x &= yx = x & yx |= y的缩写x = x | y。Java 没有&&=or||=运算符可以做你想做的事。

和运算符(与, , , , 和&一起)是按位运算符对于任何整数类型,该表达式将执行按位与运算。同样,执行按位或。要执行按位运算,数字中的每个位都被视为布尔值,带有指示和指示。因此,, 因为是二进制的并且是。同样,。 维基百科对不同的运算符有很好的完整解释。现在,对于布尔值,我认为|~^<<>>>>>x & y|1true0false3 & 2 == 230...01120...0103 | 2 == 3您可以将&and|用作and 的非短路等效项&&||但我无法想象您为什么要这样做。

于 2010-06-30T18:32:15.827 回答