最近、私はこれを使用するコードを見ました:
boolean val = something();
val |= somethingElse();
興味深い部分は、ブールプリミティブ型で作成された| =(バイナリのような)演算子です。
整数型であるかのようにブール値の| =が存在し、この演算子のJava仕様を検索しましたが、何も見つかりませんでした。
左の値がすでに真である場合に右のオペランドが評価されるかどうか知りたいです。
誰かが私にJavaこれの仕様を教えてもらえますか?
JLSから:
_
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
を返すと仮定します)。
左の値がすでに真である場合に右のオペランドが評価されるかどうか知りたいです。
はい、_|
_は短絡しないため、評価されます。
Javaプログラミング言語は、演算子のすべてのオペランド(条件演算子_
&&
_、_||
_、および_? :
_を除く)が以前に完全に評価されているように見えることを保証します操作自体の任意の部分が実行されます。したがって、_
||
_は、boolean
またはBoolean
オペランドで_|
_と同じ結果を計算します。右側のオペランド式が常にではなく条件付きで評価される点のみが異なります。
|
の定義については、 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 を参照してください。定義はあなたが思うものです。
私が驚いたのは、||=
演算子がないことです。
ビット単位の論理演算子は、ブール値に対する「通常の」論理演算子と同じ効果があります。
から 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;
}
>>I'd be curious if right operand is evaluated if left value already is true.
ビット単位の演算子(|
、&
、..など)は、完了する前に両側を評価します。
論理演算子(&&
、||
、..など)は、場合によっては2番目の部分の評価をスキップできます。これはshort-circuit
と呼ばれます。
これはバイナリではなく、「OR」論理ステートメントです。
val |= {something else}
ブール式と同じです。
val == val or {something else}
これは包括的または(通常のまたは数学表現およびコンピュータサイエンスで使用される)
一部のプログラミング言語では、または2つで示されています||標識といくつかの1つずつ|それらの1つは、SQLと、DTDJSONなどについて私が知っているすべてのデータベース言語です。