「&」と「&&」、「|」と「||」の違い~Javaの論理演算子~

Java Silver

Javaの論理演算子

Javaの論理演算子と意味は以下の通りです。

論理演算子意味
&x & yx、yの両方がtrueの場合、trueを返す
&&x && yx、yの両方がtrueの場合、trueを返す
|x | yx、yのどちらかがtrueの場合、trueを返す
||x || yx、yのどちらかがtrueの場合、trueを返す
!!xxがtrueであればfalse、falseであればtrueを返す

&と&&、|と||の違い

&と&&、|と||の違いは、「右オペランドを評価するかしないか」という点です。

&&や||は「ショートサーキット演算子」とも呼ばれ、「左オペランドの結果によっては、右オペランドの評価を省略」します。

&& の場合

以下のコードを見てみましょう。

boolean flg ;
int x = 10 ;
int y = 10 ;

flg = x++ == 1 && y++ == 10 ;

System.out.println(flg);
System.out.println("x:" + x + " y:" + y);
実行結果

false
x:11 y:10

この場合、

&&」の左オペランドは「x++ == 11」、右オペランドは「y++ == 10」です。

&&は、左右のオペランド両方がtrueの場合、trueを返す論理演算子なので、

左オペランドがfalseの段階で、論理演算の結果がfalseとなることが確定します。

&&や||は、このような場合の無駄な評価を省略します。

また、出力結果からxが11yが10であることがわかります。

これは、左オペランドの「x++ == 11」は評価され、xがインクリメントされたのに対し、

右オペランドの評価は行われず、yのインクリメントは発生しなかった為です。

|| の場合

今回の例は「&&」でしたが、「||」も同様の動作をします。

boolean flg ;
int x = 10 ;
int y = 10 ;

flg = x++ == 10 || y++ == 11 ;

System.out.println(flg);
System.out.println("x:" + x + " y:" + y);
実行結果

true
x:11 y:10

この場合、

&&」の左オペランドは「x++ == 10」、右オペランドは「y++ == 11」です。

||は、左右のオペランドどちらかがtrueの場合、trueを返す論理演算子なので、

左オペランドがtrueの段階で、論理演算の結果がtrueとなることが確定します。

また、先ほど同様、出力結果が、xが11yが10であるのは、

これは、左オペランドの「x++ == 10」は評価され、xがインクリメントされたのに対し、

右オペランドの評価は行われず、yのインクリメントは発生しなかったことが理由です。

& の場合

boolean flg ;
int x = 10 ;
int y = 10 ;

flg = x++ == 1 & y++ == 10 ;

System.out.println(flg);
System.out.println("x:" + x + " y:" + y);
実行結果

false
x:11 y:11
⇒左オペランドの結果にかかわらず、右オペランドも評価される
⇒両方の値がインクリメントされる

| の場合

boolean flg ;
int x = 10 ;
int y = 10 ;

flg = x++ == 10 | y++ == 11 ;

System.out.println(flg);
System.out.println("x:" + x + " y:" + y);
実行結果

true
x:11 y:11
⇒左オペランドの結果にかかわらず、右オペランドも評価される
⇒両方の値がインクリメントされる

! の場合

boolean flg ;
int x = 10 ;

flg = !(x == 10) ;

System.out.println(flg);
実行結果

false
⇒(x == 10)がtrueなので、反対のfalseを返します。
boolean flg ;
boolean f_flg = false ;

flg = !f_flg ;

System.out.println(flg);
実行結果

true
⇒f_flgがfalseなので、反対のtrueを返します。

まとめ

&&や||は「左オペランドの評価で論理演算の結果が確定すると、右オペランドを評価しない」ということがポイントです。

もし、両オペランドを評価したい場合などは、「&」や「|」を使用します。

Javaでは、上記のように、論理演算子によって「評価する/しない」をコントロールできるので、注意が必要です。

コメント

タイトルとURLをコピーしました