論理演算子

「かつ」、「または」、「〜でない」を含む複雑な条件

これまでの学習で、「aは0より大きい」や「bは0に等しい」のような簡単な条件については、十分に理解できたことでしょう。 ここではさらに、「aは0より大きい、かつbは0に等しい」や「aは0より大きい、またはbは0に等しい」といった条件について考えてみましょう。 このような複雑な条件を表現するには論理演算子(logical operator)を使います。 「かつ」は && で、「または」は || 、「〜でない」は ! で表現します。

例えば、「aは0より大きい、かつbは0に等しい」は

a > 0 && b == 0

となり、 a > 0 と b == 0 の両方ともtrueの場合だけ、式全体の値がtrueになります。 どちらか一方でもfalseならば、式全体の値はfalseになります。

「aは0より大きい、またはbは0に等しい」は

a > 0 || b == 0

となります。 今度は、 a > 0 か b == 0 のうち、少なくても一方がtrueならば、式全体の値がtrueになります。 もちろん、両方ともtrueの場合は、式全体の値はtrueです。

そして、「aは0より大きくない」は

! (a > 0)

となります。 a > 0 がfalseの場合だけ式全体がtrueになります。

表 6-2 : 論理演算子
演算子 使い方 式の値がtrueとなる場合
&& (条件1) && (条件2) (条件1)も(条件2)もともにtrue
|| (条件1) || (条件2) (条件1)か(条件2)のどちらかがtrue
! ! (条件) (条件)がfalse
図 6-6 : 論理演算子

&& では、(条件1)がtrueの場合だけ(条件2)が評価されます。 もしも(条件1)がfalseならば、(条件2)がどうであろうと、式全体はfalseであることが確定だからです。 || では、(条件1)がfalseの場合だけ(条件2)が評価されます。 もしも(条件1)がtrueならば、(条件2)がどうであろうと、式全体はtrueであることが確定だからです。

それでは、論理演算子の使い方をサンプルコードで確かめていきましょう。

最初は && を使ったコードです。

OperatorSample08.java
import java.io.*;

class OperatorSample08 {
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("一つ目の数を入力してください。");
        double num1 = Double.parseDouble(br.readLine());
        
        System.out.println("二つ目の数を入力してください。");
        double num2 = Double.parseDouble(br.readLine());
        
        if(num1 > 0 && num2 > 0){
            System.out.println("両方とも正の数です。");
        }else{
            System.out.println("少なくとも一方は0以下の数です。");
        }
    }
}

if〜else文の条件は、 num1 > 0 && num2 > 0 となっています。 したがって、 num1 > 0 と num2 > 0 がともにtrueの場合は、「両方とも正の数です。」と表示します。 そうでない場合、すなわち「num1が0以下、またはnum2が0以下」の場合は、「少なくとも一方は0以下の数です。」と表示します。

OperatorSample08の実行結果 1
一つ目の数を入力してください。
4
二つ目の数を入力してください。
2
両方とも正の数です。
OperatorSample08の実行結果 2
一つ目の数を入力してください。
8
二つ目の数を入力してください。
-5
少なくとも一方は0以下の数です。

この他にも数値を変えて試してみてください。

次は || を使ってみましょう。

OperatorSample09.java
import java.io.*;

class OperatorSample09 {
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("一つ目の数を入力してください。");
        double num1 = Double.parseDouble(br.readLine());
        
        System.out.println("二つ目の数を入力してください。");
        double num2 = Double.parseDouble(br.readLine());
        
        if(num1 > 0 || num2 > 0){
            System.out.println("少なくとも一方は正の数です。");
        }else{
            System.out.println("両方とも0以下の数です。");
        }
    }
}

if〜else文の条件は、 num1 > 0 || num2 > 0 となっています。 したがって、 num1 > 0 と num2 > 0 のどちらかがtrueの場合、「少なくとも一方は正の数です。」と表示します。 そうでない場合、すなわち「num1が0以下、かつnum2が0以下」の場合は、「両方とも0以下の数です。」と表示します。

OperatorSample09の実行結果 1
一つ目の数を入力してください。
5
二つ目の数を入力してください。
0
少なくとも一方は正の数です。
OperatorSample09の実行結果 2
一つ目の数を入力してください。
-6
二つ目の数を入力してください。
0
両方とも0以下の数です。

最後に ! の例を見てみましょう。

OperatorSample10.java
import java.io.*;

class OperatorSample10 {
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("数を入力してください。");
        double num = Double.parseDouble(br.readLine());
        
        if(! (num > 0)){
            System.out.println("0以下の数です。");
        }else{
            System.out.println("正の数です。");
        }
    }
}

if〜else文の条件は、 ! (num > 0) となっています。 したがって、 num1 > 0 がfalseの場合、「0以下の数です。」と表示します。 そうでない場合、すなわち「num1 > 0 」がtrueの場合は、「正の数です。」と表示します。

OperatorSample10の実行結果 1
数を入力してください。
10
正の数です。
OperatorSample10の実行結果 2
数を入力してください。
-20
0以下の数です。

「かつ」は && で、「または」は || 、「〜でない」は ! を使う。

if〜else文と論理演算子を使いこなす

これまでに学習した、条件分岐に関する知識を総動員して、合格判定のプログラムを完成させてみましょう。

PassOrFail.java
import java.io.*;

class PassOrFail {
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("得点を入力してください。");
        int point = Integer.parseInt(br.readLine());
        
        if(point >= 80 && point <=100){
            if(point == 100){
                System.out.println("満点で合格です!");
            }else{
                System.out.println("合格です。");
            }
            System.out.println("おめでとうございます。");
        }else if(point >= 60 && point < 80){
            System.out.println("不合格 Aランクです。");
            System.out.println("おしい。合格まであと一歩です。");
        }else if(point >= 0 && point < 60){
            System.out.println("不合格 Bランクです。");
            System.out.println("学習方法を再検討しましょう。");
        }else{
            System.out.println("得点は0から100までの範囲です。");
        }
        
        System.out.println("合格発表を終わります。");
    }
}

今回は、論理演算子を使って、より詳しく条件を設定しています。 どの条件もfalseだった場合は、100を超える得点か、マイナスの得点が入力されたことになります。 その場合は、「得点は0から100までの範囲です。」というメッセージを表示します。

PassOrFailの実行結果 1
得点を入力してください。
200
得点は0から100までの範囲です。
合格発表を終わります。
PassOrFailの実行結果 2
得点を入力してください。
-100
得点は0から100までの範囲です。
合格発表を終わります。