39

つまり、次の 2 つのステートメントは同じように動作しますか?

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

テストを書くだけでよいことはわかっていますが、誰かがこれを手に負えずに知っている可能性があり、他の人は答えが役立つと思うかもしれません.

4

2 に答える 2

45

いいえ、|=andはショートサーキットしないと&=の複合代入バージョンであるため、ショートサーキットしないでください。&|

JLS 15.26.2 複合代入演算子

の形式の複合代入式は、E1 op= E2E1 = (T)((E1) op (E2))T型ですがE1E1は 1 回だけ評価されます。

したがって、 を仮定boolean &すると、 の等価性isFoobared &= methodWithSideEffects()は次のようになります。

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

一方&&、 and||は短絡しますが、不可解なことに、Java にはそれらの複合代入バージョンがありません。つまり、Java には も&&=もありません||=

こちらもご覧ください


とにかく、このショートサーキットビジネスは何ですか?

boolean論理演算子 (&および|) とboolean条件付きの対応する演算子 (&&および)の違いは||、前者が「短絡」しないことです。後者はそうします。つまり、例外などはないと仮定します。

  • &そして| 常に両方のオペランドを評価します
  • &&||右オペランドを条件付きで評価します。右側のオペランドは、その値が二項演算の結果に影響を与える可能性がある場合にのみ評価されます。つまり、次の場合、右側のオペランドは評価されません。
    • の左オペランドは次のように&&評価されますfalse
      • (右のオペランドが何に評価されても、式全体が であるためfalse)
    • の左オペランドは次のように||評価されますtrue
      • (右のオペランドが何に評価されても、式全体が であるためtrue)

参考文献

于 2010-06-30T18:26:25.210 に答える
4

いいえ、ありません。 はx &= yの略でx = x & yあり、x |= yの略ですx = x | y。Javaには、あなたが望むことをする&&=or||=演算子はありません。

&and|演算子 ( 、~^<<>>および>>>) はビット演算子です。式x & yは、任意の整数型に対して、ビットごとの AND 演算を実行します。同様に|、ビットごとの論理和を実行します。ビット単位の演算を実行するには、数値の各ビットがブール値のように扱われ、 と が示さ1れます。したがって、はバイナリであり、はです。同様に、. ウィキペディアには、さまざまな演算子の完全な説明があります。さて、ブール値についてはtrue0false3 & 2 == 230...01120...0103 | 2 == 3andを&andの非短絡等価物|として使用することで回避できますが、とにかくそうしたい理由は想像できません。&&||

于 2010-06-30T18:32:15.827 に答える