Javaの論理演算子
Javaの論理演算子と意味は以下の通りです。
論理演算子 | 例 | 意味 |
& | x & y | x、yの両方がtrueの場合、trueを返す |
&& | x && y | x、yの両方がtrueの場合、trueを返す |
| | x | y | x、yのどちらかがtrueの場合、trueを返す |
|| | x || y | x、yのどちらかがtrueの場合、trueを返す |
! | !x | xが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が11、yが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が11、yが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では、上記のように、論理演算子によって「評価する/しない」をコントロールできるので、注意が必要です。
コメント