做&=和
换句话说,以下两个陈述的行为方式是一样的吗?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
我意识到我可以写一个测试,但有人可能会知道这一点,其他人可能会发现有用的答案。
不, |=和&=不会短路,因为它们是&和|的复合赋值版本 ,它不会短路。
JLS 15.26.2复合赋值运算符
E1 op= E2形式的复合赋值表达式等价于E1 = (T)((E1) op (E2)) ,其中T是E1的类型,只是E1只计算一次。
因此,假设boolean & , isFoobared &= methodWithSideEffects()的等价性是:
isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit
另一方面&&和|| 做shortcircuit,但莫名其妙地Java没有他们的复合赋值版本。 也就是说,Java既没有&&=也没有||= 。
也可以看看
无论如何,这个短路业务是什么?
该之间的差异boolean (逻辑运算符&和| )相比,他们的boolean条件同行( &&和|| )是,前者没有“短路”; 后者呢。 也就是说,假设没有例外等:
&和| 总是评估两个操作数 &&和|| 有条件地评估正确的操作数; 只有在其值可能影响二进制操作的结果时才评估右操作数。 这意味着在下列情况下不会评估右操作数: &&的左操作数评估为false false ) ||的左操作数 评估为true true ) 参考
& , ^和| && || 不,他们不这样做,因为x &= y是x = x & y缩写, x |= y是x = x | y简写。 x = x | y 。 Java没有&&=或||=运算符,它们可以做你想做的事情。
&和| 运算符(以及~ , ^ , << , >>和>>> )是按位运算符。 对于任何整型,表达式x & y将执行按位和操作。 同样, | 执行按位或。 为了执行按位操作,数字中的每一位都被视为布尔值,其中1表示true , 0表示false 。 因此, 3 & 2 == 2 ,因为3是二进制的0...011 ,而2是0...010 。 同样, 3 | 2 == 3 3 | 2 == 3 。 维基百科对不同运营商有一个很好的完整解释。 现在,对于一个布尔值,我想你可以使用&和|离开 作为&&和||非短路等价物 ,但我无法想象为什么你会想要。
上一篇: Do &= and
下一篇: = operator
