27

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

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

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

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

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

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

4

5 に答える 5

35

JLSから:

15.26.2。複合代入演算子

フォームの複合代入式は、E1 op= E2と同等ですE1 = (T) ((E1) op (E2))。ここTで、はのタイプですが、 1回だけ評価される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。条件付き-または演算子||

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

于 2013-03-14T13:55:03.147 に答える
4

の定義については、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を参照してください|=。定義はまさにあなたが考えるものです。

私を驚かせるのは、||=オペレーターがいないことです。

于 2013-03-14T13:57:11.050 に答える
3

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

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;
}
于 2013-03-14T13:54:10.663 に答える
2
>>I'd be curious if right operand is evaluated if left value already is true.

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

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

于 2013-03-14T14:01:57.700 に答える
-1

バイナリではなく、「OR」ロジックステートメントであるという意味です

 val |= {something else} 

ブール式と同じです。

val == val or {something else} 

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

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

于 2013-03-14T16:47:54.060 に答える