だから、ブール型の二項演算子のために、Javaがあり&
、|
、^
、&&
と||
。
ここで彼らが何をしているのかを簡単に要約しましょう:
の場合
&
、結果値はtrue
、両方のオペランド値がtrue
;の場合です。それ以外の場合、結果はfalse
です。の場合
|
、結果値はfalse
、両方のオペランド値がfalse
;の場合です。それ以外の場合、結果はtrue
です。の場合
^
、結果値はtrue
、オペランド値が異なる場合です。それ以外の場合、結果はfalse
です。
&&
オペレータは次のようである&
が、その左側の値がオペランドその右側のオペランドた場合にのみ評価されますtrue
。
||
オペレータは次のようである|
が、その左側の値がオペランドその右側のオペランドた場合にのみ評価されますfalse
。
現在、5つすべてのうち、3つには複合代入バージョン、つまり、、|=
が&=
あり^=
ます。だから私の質問は明白です:なぜJavaは提供しません&&=
と||=
同様?必要以上に必要だ&=
と思います|=
。
そして、「長すぎるから」というのは良い答えではないと思います。Javaには>>>=
。この省略にはもっと良い理由があるに違いありません。
15.26代入演算子から:
12個の代入演算子があります。[...]
= *= /= %= += -= <<= >>= >>>= &= ^= |=
&&=
と||=
が実装された場合、最初に右側を評価しないのはそれだけであるというコメントがありました。複合代入演算子が最初に右側を評価するというこの概念は間違いだと思います。
フォームの複合代入式は、
E1 op= E2
と同等ですE1 = (T)((E1) op (E2))
。ここT
で、はのタイプですがE1
、E1
評価されるのは1回だけです。
証拠として、次のスニペットは、NullPointerException
ではなく、をスローしArrayIndexOutOfBoundsException
ます。
int[] a = null;
int[] b = {};
a[0] += b[-1];