web-dev-qa-db-ja.com

Javaブール値| =演算子

最近、私はこれを使用するコードを見ました:

boolean val = something();
val |= somethingElse();

興味深い部分は、ブールプリミティブ型で作成された| =(バイナリのような)演算子です。

整数型であるかのようにブール値の| =が存在し、この演算子のJava仕様を検索しましたが、何も見つかりませんでした。

左の値がすでに真である場合に右のオペランドが評価されるかどうか知りたいです。

誰かが私にJavaこれの仕様を教えてもらえますか?

26
Pointer Null

JLSから:

15.26.2。複合代入演算子

_E1 op= E2_形式の複合代入式は、E1 = (T) ((E1) op (E2))と同等です。ここで、Tは_E1_のタイプですが、_E1_のみが評価されます。一度。

15.22.2。ブール論理演算子_&_、_^_、および_|_

_&_、_^_、または_|_演算子の両方のオペランドがタイプbooleanまたはBooleanの場合、ビット演算子式のタイプは次のようになります。 boolean。すべての場合において、オペランドは必要に応じてボックス化解除変換(§5.1.8)の対象となります。

_|_の場合、両方のオペランド値がfalseの場合、結果値はfalseになります。それ以外の場合、結果は真です。

この意味は

_val |= somethingElse();
_

厳密に同等です

_val = val | somethingElse();
_

somethingElse()booleanまたはBooleanを返すと仮定します)。

左の値がすでに真である場合に右のオペランドが評価されるかどうか知りたいです。

はい、_|_は短絡しないため、評価されます。

15.7.2。演算の前にオペランドを評価する

Javaプログラミング言語は、演算子のすべてのオペランド(条件演算子_&&_、_||_、および_? :_を除く)が以前に完全に評価されているように見えることを保証します操作自体の任意の部分が実行されます。

15.24。条件付き-または演算子_||_

したがって、_||_は、booleanまたはBooleanオペランドで_|_と同じ結果を計算します。右側のオペランド式が常にではなく条件付きで評価される点のみが異なります。

30
NPE

|の定義については、 http://docs.Oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22.2 を参照してください。 |=の定義については、 http://docs.Oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2 を参照してください。定義はあなたが思うものです。

私が驚いたのは、||=演算子がないことです。

4

ビット単位の論理演算子は、ブール値に対する「通常の」論理演算子と同じ効果があります。

から Java言語仕様 15.22:

&、^、または|の両方のオペランドが演算子の型がブールまたはブールの場合、ビット単位の演算子式の型はブールです。すべての場合において、オペランドは必要に応じてボックス化解除変換(§5.1.8)の対象となります。

&の場合、両方のオペランド値が真であれば、結果値は真です。それ以外の場合、結果はfalseです。

^の場合、オペランド値が異なると結果値はtrueになります。それ以外の場合、結果はfalseです。

|の場合、両方のオペランド値がfalseの場合、結果値はfalseになります。それ以外の場合、結果は真です。

唯一の本当の違いは、ビット単位の演算子を使用して評価を短絡できないことです。

たとえば、このコードはNullPointerExceptionをスローします。

Boolean b1 = new Boolean(true);
Boolean b2 = null;
if (b1 || b2) {
    //no null pointer here;
}
if (b1 | b2) {
    //null pointer here;
}
2
Jean Waghetti
>>I'd be curious if right operand is evaluated if left value already is true.

ビット単位の演算子(|&、..など)は、完了する前に両側を評価します。

論理演算子(&&||、..など)は、場合によっては2番目の部分の評価をスキップできます。これはshort-circuitと呼ばれます。

2
Ostap Andrusiv

これはバイナリではなく、「OR」論理ステートメントです。

 val |= {something else} 

ブール式と同じです。

val == val or {something else} 

これは包括的または(通常のまたは数学表現およびコンピュータサイエンスで使用される)

一部のプログラミング言語では、または2つで示されています||標識といくつかの1つずつ|それらの1つは、SQLと、DTDJSONなどについて私が知っているすべてのデータベース言語です。

0
sivi