在 Java 中,&= 和 |= 短路吗?

2022-09-01 03:15:26

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

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

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


答案 1

否,并且不要短循环,因为它们是 和 的复合赋值版本,它们不短循环。|=&=&|

JLS 15.26.2 复合赋值运算符

该形式的复合赋值表达式等价于 ,其中 是 的类型,只计算一次。E1 op= E2E1 = (T)((E1) op (E2))TE1E1

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

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

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

另请参见


这到底是什么短路业务?

逻辑运算符 (和 ) 与它们的条件对应运算符 ( 和 ) 之间的区别在于前者不 “短路”;后者确实如此。也就是说,假设没有例外等:boolean&|boolean&&||

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

引用


答案 2

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

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


推荐