論理演算子による複数条件の設定
6.5 論理演算子による複数条件の設定
これまでの if 文では、条件式のなかの条件は一つでした。つまり、「もし○○○ならば、×××する」という単一の条件で判断していましたが、if 文の条件式では「もし○○○で、なおかつ△△△△ならば、×××する」や「もし○○○か、もしくは△△△△ならば、×××する」というように、複数の条件を設定することができます。
このように複数の条件を設定する場合は、論理演算子を用います。
6.5.1 論理演算子とは
複雑な条件を組み合わせて表すときに使うのが論理演算子です。論理演算子の左右に来るのは、必ず true かfalse、もしくは解がそのようになる式となります。論理演算子は if 文、for 文、while 文の条件式で、比較演算子とともによく使用されます。
Java では、図 6.5.1 にある論理演算子を主に使います。
表 6.5.1 : 論理演算子の種類
それぞれの論理演算子がどのような値を返すのか、もう少し詳しく見てみましょう。
1. &&(AND)
&&演算子は、左辺と右辺の値がともに「true」場合に、全体の値が true となり、それ以外の場合は false となります。
表 6.5.2 : AND 条件の演算結果
書式:条件文と「&&」論理演算子
この場合は、もし条件式 A が合っていて、かつ、条件式 B が合っていたら処理を行う、ということになります。
フローチャートにすると、図 6.5.1 のようになります。
図 6.5.1 : 条件文と&&論理演算子のフローチャート
2. ||(OR)
||演算子を使った式は、左辺・右辺のどちらかの値が true であれば、全体の値が true となり、それ以外の場合は false となります。
表 6.5.3 : OR 条件の演算結果
書式:条件文と「||」論理演算子
この場合は、もし条件式 A または条件式 B のどちらか合っていたら処理を行う、ということになります。
フローチャートにすると、図 6.5.2 のようになります。
「 | 」の入力方法「 | 」は、半角英数入力にした状態で、Shift キーを押しながら「 | 」キーを押します。
「 | 」キーは、多くの場合はキーボード右側、Enter キーの斜め左上、BackSpase の左にあります。
図 6.5.2 : 条件文と||論理演算子のフローチャート
3. !(NOT)
「!」は論理否定と呼ばれ、演算子の右辺の値を反転します。
表 6.5.4 : 論理 NOT
書式:条件文と「!」論理演算子
論理演算子「!」は条件の否定を表すものですので、この場合は、もし条件式の結果が true ならそれを否定されるので処理は行われない、もし条件式の結果が false ならそれを否定されるので処理が行われるということになります。
フローチャートにすると、図 6.5.3 のようになります。
図 6.5.3 : 条件文と! 論理演算子
6.5.2 論理演算子の結果を確認するプログラム
論理演算子の演算結果を出力するサンプルプログラムを作成し、結果を確認します。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch6
③ 名前 :LogicalOperator1
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ LogicalOperator1.java
package jp.co.f1.intro.ch6; public class LogicalOperator1 { public static void main(String[] args) { //比較用の真偽値を管理するための変数 boolean a = true; boolean b = false; System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("a && b :" + (a && b)); System.out.println("a || b :" + (a || b)); System.out.println("!a : " + (!a)); } }
実行結果
解説
8 行目では boolean 型の変数 a に true を、9 行目では boolean 型の変数 b に false を代入し、11 行目と 12 行目でそれぞれの値を出力しています。
14 行目以降では、それぞれの論理演算子の結果を出力しています。
14 行目の「(a && b)」は「true && false」ということになり、両方 true ではないので、結果は false となります。
15 行目の「(a || b)」は「true || false」で、一方が true なので、結果は true となります。
16 行目の「(!a)」は「!true」で、true が否定され false が出力されます。
次の項で if-else 文の条件に論理演算子「&&」を使ったサンプルプログラムを見てみます。
6.5.3 論理演算子&&で条件式が成立するプログラム
論理演算子&&を使った複数条件が成立し、「if ブロック内」のメッセージが出力されることを確認します。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch6
③ 名前 :LogicalOperator2
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ LogicalOperator2.java
package jp.co.f1.intro.ch6; public class LogicalOperator2 { public static void main(String[] args) { //比較用の数値を管理するための変数 int a = 5; System.out.println("*****if 文の判定開始*****"); if(0 <= a && a <= 10){ System.out.println("変数 a は 0 以上 10 以下。"); }else{ System.out.println("変数 a は 0 以上 10 以下ではない。"); } System.out.println("*****if 文の判定終了*****"); } }
実行結果
解説
8 行目では変数 a に 5 を代入しています。12 行目の if 文では、「変数 a が 0 以上かつ 10 以下」の場合、13 行目の処理で「変数 a は 0 以上 10 以下。」というメッセージを出力します。その条件が成立しない場合は続く else文に移行し、15 行目で「変数 a は 0 以上 10 以下ではない」というメッセージを出力します。
変数 a には 5 が代入されているため、12 行目の条件式「a>=0」であり、かつ「a<=10」という条件が成立します。よって、13 行目の処理が実行され、「変数 a は 0 以上 10 以下。」という文字列が表示されます。
この場合のフローチャートは図 6.5.4 のようになります。
図 6.5.4 : LogicalOperator2 のフローチャート
次の項で論理演算子&&で条件が成立しない場合のサンプルプログラムを作成していきます。
6.5.4 論理演算子&&で条件式が成立しないプログラム
論理演算子&&を使った複数条件が成立せず、「else ブロック内」のメッセージが出力されることを確認します。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch6
③ 名前 :LogicalOperator3
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ LogicalOperator3.java
package jp.co.f1.intro.ch6; public class LogicalOperator3 { public static void main(String[] args) { //比較用の数値を管理するための変数 int a = 11; System.out.println("*****if 文の判定開始*****"); if(0 <= a && a <= 10){ System.out.println("変数 a は 0 以上 10 以下。"); }else{ System.out.println("変数 a は 0 以上 10 以下ではない。"); } System.out.println("*****if 文の判定終了*****"); } }
実行結果
解説
このサンプルプログラムでは、8 行目で int 型の変数 a に 11 を代入しています。
12 行目の if 文では、「変数 a が 0 以上」という条件は成立するものの、「変数 a が 10 以下」という条件が成立しません。
従って if 文の条件は成立しないことになり、15 行目の処理が実行され「変数 a は 0 以上 10 以下ではない」というメッセージが出力されます。
この場合のフローチャートは図 6.5.5 のようになります。
図 6.5.5 : LogicalOperator3 のフローチャート
6.5.5 論理演算子||で条件式が成立するプログラム
論理演算子「||」を使った複数条件が成立し、「if ブロック内」のメッセージが出力されることを確認します。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch6
③ 名前 :LogicalOperator4
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ LogicalOperator4.java
package jp.co.f1.intro.ch6; public class LogicalOperator4 { public static void main(String[] args) { //比較用の数値を管理するための変数 int a = 15; System.out.println("*****if 文の判定開始*****"); if(a <= 0 || 10 <= a){ System.out.println("変数 a は 0 以下 もしくは 10 以上。"); }else{ System.out.println("変数 a は 0 以下 もしくは 10 以上ではない。"); } System.out.println("*****if 文の判定終了*****"); } }
実行結果
解説
このサンプルプログラムでは、8 行目で int 型の変数 a に 15 を代入しています。
12 行目の if 文では、「変数 a が 0 以下もしくは 10 以上」の場合、13 行目の処理で「変数 a は 0 以下もしくは10 以上。」というメッセージを出力します。12 行目の条件が成立しない場合 14 行目の else 文にあてはまり、15行目で「変数 a は 0 以上 10 以下。」というメッセージを出力します。
変数 a には 15 が代入されていますので、条件式「a<=0」ではありませんが、「a>=10」という条件が成立しますので、13 行目の処理が実行されます。
この場合のフローチャートは図 6.5.6 のようになります。
図 6.5.6 : LogicalOperator4 のフローチャート
次の節で論理演算子||の条件が成立しないパターンのサンプルプログラムを見てみます。
6.5.6 論理演算子||で条件式が成立しないプログラム
論理演算子||を使った条件式が成立せず、「else ブロック内」のメッセージが出力されることを確認します。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch6
③ 名前 :LogicalOperator5
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ LogicalOperator5.java
package jp.co.f1.intro.ch6; public class LogicalOperator5 { public static void main(String[] args) { //比較用の数値を管理するための変数 int a = 5; System.out.println("*****if 文の判定開始*****"); if(a <= 0 || 10 <= a){ System.out.println("変数 a は 0 以下もしくは 10 以上。"); }else{ System.out.println("変数 a は 0 超過 10 未満。"); } System.out.println("*****if 文の判定終了*****"); } }
実行結果
解説
変数 a には 5 が代入されているので、条件式「a<=0」という条件も「a>=10」という条件もどちらも成立しません。そのため、else 文内の 15 行目の処理が実行されます。
この場合のフローチャートは図 6.5.7 のようになります。
図 6.5.7 : LogicalOperator5 のフローチャート
6.5.7 論理演算子!で条件式が成立しないプログラム
論理演算子!を使った条件式が成立せずに、「else ブロック内」のメッセージが出力されることを確認します。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch6
③ 名前 :LogicalOperator6
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ LogicalOperator6.java
package jp.co.f1.intro.ch6; public class LogicalOperator6 { public static void main(String[] args) { //比較用の数値を管理するための変数 int a = 0; System.out.println("*****if 文の判定開始*****"); if(!(a == 0)){ System.out.println("変数 a は 0 と等しくない。"); }else{ System.out.println("変数 a は 0 と等しい。"); } System.out.println("*****if 文の判定終了*****"); } }
実行結果
解説
8 行目で int 型の変数 a に 0 を代入しています。
12 行目の if 文の条件式「!(a == 0)」では論理演算子!が記述されています。「a == 0」は true となりますが、論理演算子!が付くことにより true が否定され、この条件式の結果は false になります。よって、if 文は処理を行わず、else 文の中に入り 15 行目が実行されます。
この場合のフローチャートは図 6.5.8 のようになります。
図 6.5.8 : LogicalOperator6 のフローチャート