if〜else文の入れ子

条件がfalseの場合にif〜else文を実行する

あるものの中に、それとよく似たものが入っている様子を「入れ子」といいます。 ロシアの民芸品「マトリョーシカ」をイメージしていただければ分かりやすいでしょう。 プログラミングの世界では、この入れ子がしばしば登場するのです。

さて、もう一度if〜else文の構文を見てみましょう。

構文 : if〜else文
if (条件1)
    文1
else
    文A

if〜else文はもちろん文の一種ですから、ここで文Aはif〜else文であってもいいことになります。そうすると、次のような形になります。

if (条件1)
    文1
else
    if (条件2)
        文2
    else
        文B

ここで、さらに文Bはif〜else文であってもよく...というふうに入れ子の構造をどんどん深くしていくことができます。 そうすると、インデントもどんどん深くなっていって、コードが読みづらくなってきます。 そこで、改行とインデントを調整してやると、次のようなすっきりした形が出来上がります。 この構文は、実際のプログラムでよく使われる重要なものです。

構文 : if〜else文の入れ子(条件がfalseの場合にif〜else文を実行する)
if (条件1)
    文1
else if (条件2)
    文2
else if (条件3)
    文3
else
    文4
図 6-4 : if〜else文の入れ子(条件がfalseの場合にif〜else文を実行する)のフローチャート

この構文では、条件1がtrueの場合は文1が実行されます。 条件1がfalseで、条件2がtrueの場合は文2が実行されます。 条件1も条件2もfalseで、条件3がtrueの場合は文3が実行されます。 どの条件もfalseの場合は文4が実行されます。

簡単に言えば、上から順に条件を調べていき、最初にtrueとなった条件に対応する文が実行されるのです。

この構文の形成過程からわかるように、条件はいくつでも増やせます。 また、最後のelseを省略することもできます。 ただし、elseを省略した場合、どの条件もfalseなら、構文中のどの文も実行されることはありません。

もちろん、この構文においても、ブロックを使って複数の文を実行することができます。

else if という形がこの構文の特徴ですが、ご覧いただいたように、これは else と if という2つのキーワードが並んでいるだけに過ぎません。 一つのキーワードと勘違いして、 elseif のようにつなげてしまわないように注意しましょう。

では、if〜else文の入れ子を実際に使ってみましょう。

IfSample04.java
import java.io.*;

class IfSample04 {
    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){
            System.out.println("合格です。");
            System.out.println("おめでとうございます。");
        }else if(point >= 60){
            System.out.println("不合格 Aランクです。");
            System.out.println("おしい。合格まであと一歩です。");
        }else{
            System.out.println("不合格 Bランクです。");
            System.out.println("学習方法を再検討しましょう。");
        }
        
        System.out.println("合格発表を終わります。");
    }
}

このプログラムでは、 point >= 80 という条件がtrueの場合は、「合格です。」「おめでとうございます。」と表示されます。 point >= 80 がfalseの場合は、 point >= 60 がtrueかどうか調べて、trueならば「不合格 Aランクです。」「おしい。合格まであと一歩です。」と表示します。 point >= 60 もfalseの場合は、「不合格 Bランクです。」「学習方法を再検討しましょう。」と表示します。

IfSample04の実行結果 1
得点を入力してください。
90
合格です。
おめでとうございます。
合格発表を終わります。
IfSample04の実行結果 2
得点を入力してください。
70
不合格 Aランクです。
おしい。合格まであと一歩です。
合格発表を終わります。
IfSample04の実行結果 3
得点を入力してください。
50
不合格 Bランクです。
学習方法を再検討しましょう。
合格発表を終わります。

if〜else if〜elseの構文を使えば、複数の条件による場合分けをすっきりと記述できる。

条件がtrueの場合にif〜else文を実行する

今度は条件がtrueの場合にif〜else文を実行することを考えてみましょう。

構文 : if〜else文の入れ子(条件がtrueの場合にif〜else文を実行する)
if (条件1)
    if(条件2)
       文1
    else
       文2
else
    文3
図 6-5 : if〜else文の入れ子(条件がtrueの場合にif〜else文を実行する)のフローチャート

ではサンプルコードを見てみましょう。

IfSample05.java
import java.io.*;

class IfSample05 {
    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){
            if(point == 100){
                System.out.println("満点で合格です!");
            }else{
                System.out.println("合格です。");
            }
            System.out.println("おめでとうございます。");
        }else{
            System.out.println("不合格です。");
            System.out.println("次のチャンスに備えましょう。");
        }
        
        System.out.println("合格発表を終わります。");
    }
}

このプログラムでは、 point >= 80 がtrueの場合は、さらに point == 100 という条件でで分岐します。 point == 100 がtrueなら「満点で合格です。」、そうでなければ「合格です。」というメッセージを出し、その後は、いずれの場合も「おめでとうございます。」と表示します。

IfSample05の実行結果 1
得点を入力してください。
100
満点で合格です!
おめでとうございます。
合格発表を終わります。
IfSample05の実行結果 2
得点を入力してください。
90
合格です。
おめでとうございます。
合格発表を終わります。
IfSample05の実行結果 3
得点を入力してください。
70
不合格です。
次のチャンスに備えましょう。
合格発表を終わります。