做&=和
换句话说,以下两个陈述的行为方式是一样的吗?
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