最近、私はこれを使用するコードを見ました:
boolean val = something();
val |= somethingElse();
興味深い部分は、ブールプリミティブ型で作成された| =(バイナリのような)演算子です。
整数型のようにブール値の|=が存在し、Java仕様でこの演算子を検索したのに驚いたのですが、見つかりませんでした。
左の値がすでに真である場合に右のオペランドが評価されるかどうか知りたいです。
誰かが私にこれのJava仕様を教えてもらえますか?
最近、私はこれを使用するコードを見ました:
boolean val = something();
val |= somethingElse();
興味深い部分は、ブールプリミティブ型で作成された| =(バイナリのような)演算子です。
整数型のようにブール値の|=が存在し、Java仕様でこの演算子を検索したのに驚いたのですが、見つかりませんでした。
左の値がすでに真である場合に右のオペランドが評価されるかどうか知りたいです。
誰かが私にこれのJava仕様を教えてもらえますか?
JLSから:
フォームの複合代入式は、
E1 op= E2
と同等ですE1 = (T) ((E1) op (E2))
。ここT
で、はのタイプですが、 1回だけ評価されるE1
点が異なります。E1
&
、、、^
または演算子の両方のオペランドが|
タイプboolean
またはBoolean
、である場合、ビット単位の演算子式のタイプはですboolean
。すべての場合において、オペランドは必要に応じて開梱変換(§5.1.8)の対象となります。の場合
|
、両方のオペランド値がfalseの場合、結果値はfalseになります。それ以外の場合、結果は真です。
この意味は
val |= somethingElse();
厳密に同等です
val = val | somethingElse();
somethingElse()
(リターンboolean
またはを想定Boolean
)。
左の値がすでに真である場合に右のオペランドが評価されるかどうか知りたいです。
|
はい、短絡しないため、評価されます。
Javaプログラミング言語は、演算子のすべてのオペランド(条件演算子、、、およびを除く)が、操作自体の一部が実行される前に完全に評価されているように見えることを保証
&&
し||
ます? :
。したがって、onまたはオペランド
||
と同じ結果を計算します。右辺のオペランド式が常にではなく条件付きで評価されるという点でのみ異なります。|
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)の対象となります。
&の場合、両方のオペランド値がtrueの場合、結果値はtrueです。それ以外の場合、結果は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つは、SQLと、DTDJSONなどについて私が知っているすべてのデータベース言語です。