つまり、次の 2 つのステートメントは同じように動作しますか?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
テストを書くだけでよいことはわかっていますが、誰かがこれを手に負えずに知っている可能性があり、他の人は答えが役立つと思うかもしれません.
つまり、次の 2 つのステートメントは同じように動作しますか?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
テストを書くだけでよいことはわかっていますが、誰かがこれを手に負えずに知っている可能性があり、他の人は答えが役立つと思うかもしれません.
いいえ、|=
andはショートサーキットしないと&=
の複合代入バージョンであるため、ショートサーキットしないでください。&
|
JLS 15.26.2 複合代入演算子
の形式の複合代入式は、
E1 op= E2
はE1 = (T)((E1) op (E2))
のT
型ですがE1
、E1
は 1 回だけ評価されます。
したがって、 を仮定boolean &
すると、 の等価性isFoobared &= methodWithSideEffects()
は次のようになります。
isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit
一方&&
、 and||
は短絡しますが、不可解なことに、Java にはそれらの複合代入バージョンがありません。つまり、Java には も&&=
もありません||=
。
boolean
論理演算子 (&
および|
) とboolean
条件付きの対応する演算子 (&&
および)の違いは||
、前者が「短絡」しないことです。後者はそうします。つまり、例外などはないと仮定します。
&
そして|
常に両方のオペランドを評価します&&
||
右オペランドを条件付きで評価します。右側のオペランドは、その値が二項演算の結果に影響を与える可能性がある場合にのみ評価されます。つまり、次の場合、右側のオペランドは評価されません。
&&
評価されますfalse
false
)||
評価されますtrue
true
)いいえ、ありません。 はx &= y
の略でx = x & y
あり、x |= y
の略ですx = x | y
。Javaには、あなたが望むことをする&&=
or||=
演算子はありません。
&
and|
演算子 ( 、~
、^
、<<
、>>
および>>>
) はビット演算子です。式x & y
は、任意の整数型に対して、ビットごとの AND 演算を実行します。同様に|
、ビットごとの論理和を実行します。ビット単位の演算を実行するには、数値の各ビットがブール値のように扱われ、 と が示さ1
れます。したがって、はバイナリであり、はです。同様に、. ウィキペディアには、さまざまな演算子の完全な説明があります。さて、ブール値については、true
0
false
3 & 2 == 2
3
0...011
2
0...010
3 | 2 == 3
andを&
andの非短絡等価物|
として使用することで回避できますが、とにかくそうしたい理由は想像できません。&&
||