做&=和

换句话说,以下两个陈述的行为方式是一样的吗?

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

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


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

JLS 15.26.2复合赋值运算符

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

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

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

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

也可以看看

  • Java中的快捷方式“or-assignment”(| =)运算符
  • |有什么区别? 和|| 在Java中?
  • 为什么Java不具有条件操作符和条件操作符的复合赋值版本? (&& =,|| =)

  • 无论如何,这个短路业务是什么?

    该之间的差异boolean (逻辑运算符&| )相比,他们的boolean条件同行( &&|| )是,前者没有“短路”; 后者呢。 也就是说,假设没有例外等:

  • &| 总是评估两个操作数
  • &&|| 有条件地评估正确的操作数; 只有在其值可能影响二进制操作的结果时才评估右操作数。 这意味着在下列情况下不会评估右操作数:
  • &&的左操作数评估为false
  • (因为不管操作数的合理性如何,整个表达式都是false
  • ||的左操作数 评估为true
  • (因为不管操作数的合理性如何,整个表达式都是true
  • 参考

  • JLS 15.22.2布尔逻辑运算符&^|
  • JLS 15.23条件与操作符&&
  • JLS 15.24条件或运算符||

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

    &| 运算符(以及~^<<>>>>> )是按位运算符。 对于任何整型,表达式x & y将执行按位和操作。 同样, | 执行按位或。 为了执行按位操作,数字中的每一位都被视为布尔值,其中1表示true0表示false 。 因此, 3 & 2 == 2 ,因为3是二进制的0...011 ,而20...010 。 同样, 3 | 2 == 3 3 | 2 == 3 。 维基百科对不同运营商有一个很好的完整解释。 现在,对于一个布尔值,我想你可以使用&|离开 作为&&||非短路等价物 ,但我无法想象为什么你会想要。

    链接地址: http://www.djcxy.com/p/73911.html

    上一篇: Do &= and

    下一篇: = operator