if文

if文による条件分岐

Javaには条件分岐のための構文としてif文(if statement)とswitch文(switch statement)があります。 まずはif文について解説していきましょう。

英語のifは、「もし〜ならば」という意味です。

一般に、if文は次のような構文になります。

構文 : if文
if (条件)
    文

そして、これがそのフローチャート(流れ図)です。

図 6-1 : if文のフローチャート

この構文では、条件がtrueの場合に文が実行され、falseの場合には実行されません。

では、if文を使ったサンプルコードを見てみましょう。

IfSample01.java
import java.io.*;

class IfSample01 {
    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("合格発表を終わります。");
    }
}

IfSample01は、ユーザーが試験の得点を入力すると合格判定をしてくれるプログラムです。 試験は100点満点で、80点以上が合格という想定です。

このコードで重要なのは次の部分です。

        if(point >= 80)
            System.out.println("合格です。");

条件が point >= 80 となっていますので、pointの値が80より大きいか等しい(80以上)ときにtrueとなり、

            System.out.println("合格です。");

という文が実行されることになります。

IfSample01を実行すると、「得点を入力してください。」と表示されますので、試しに「80」と入力すると、次のような結果になります。

IfSample01の実行結果 1
得点を入力してください。
80
合格です。
合格発表を終わります。

では、「79」と入力してみるとどうでしょうか。

IfSample01の実行結果 2
得点を入力してください。
79
合格発表を終わります。

80以上が合格ですから、80はぎりぎりの合格だったわけです。 80未満は不合格なわけですが、不合格を知らせるメッセージは表示されません。 また、100点満点を想定していますが、実際には100を超える得点や、マイナスの得点を入力しても、かまわず合否判定してしまいます。 本来なら、そういう想定範囲外の数値が入力された場合は、何らかのエラーメッセージを出したいところです。 それについては後ほど考えましょう。

さて、ここでIfSample01のコードに1文字だけ追加してみましょう。

IfSample01A.java
import java.io.*;

class IfSample01A {
    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("合格発表を終わります。");
    }
}

どこが変わったかお分かりになりますか。 コンパイルはできますが、結果は次のようになります。

IfSample01Aの実行結果
得点を入力してください。
70
合格です。
合格発表を終わります。

70で合格とは変ですね。IfSample01との違いは、

        if(point >= 80);

の部分だけです。そう、if(条件)の後に;(セミコロン)が付いているのです。 こうすると、if(条件)の部分と関連付けられるのは ; という文になってしまいます。 なんと、 ; は何もしないけれど、空文(empty statement)と呼ばれる立派な文なのです。このため、

            System.out.println("合格です。");

という文は、if(条件)の部分と無関係ということになり、無条件に実行されてしまいます。 その結果、条件がfalseでも、「合格です。」と表示されてしまうのです。 このような間違いは、初心者にはありがちですので、注意しましょう。

if(条件)の直後に;(セミコロン)を付ける必要は無い。

ブロックを使って複数の文を実行する

IfSample01では、条件がtrueの場合に

            System.out.println("合格です。");

という文だけを実行していましたが、複数の文を実行するにはどうすればいいのでしょうか。

第3章の「Javaプログラムの構成」で説明したブロックを思い出してください。 {から}までのかたまりをブロックと呼ぶのでしたね。 ブロック内の文は上から順番に実行されていきます。

条件がtrueのときに複数の文を実行するためには、if(条件)の後にブロックを置いて、そのブロックの中に、実行したい複数の文を書けばよいのです。

構文 : 複数の文を実行するif文
if (条件){
    文1
    文2
    ...
}
図 6-2 : 複数の文を実行するif文のフローチャート

この構文では、条件がtrueの場合に文1、文2、...と順番に実行されていきます。

ブロックの中の文は1つだけでもかまいません。 実行したい文が1つだけの場合でも、ブロックを使った書き方をお薦めします。 一貫性のある書き方をした方が、コードが読みやすくなるからです。 ただし、本講座では、コードの行数を減らすために、文が1つだけの場合はブロックに入れないときもあります。

IfSample02.java
import java.io.*;

class IfSample02 {
    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("おめでとうございます。");
        }
        
        System.out.println("合格発表を終わります。");
    }
}

IfSample02では条件がtrueの場合に、

            System.out.println("合格です。");
            System.out.println("おめでとうございます。");

という2つの文が実行されることになります。

IfSample02を実行して、80以上を入力してみると、

IfSample02の実行結果 1
得点を入力してください。
90
合格です。
おめでとうございます。
合格発表を終わります。

そして、80未満の場合は、相変わらず次のようになります。

IfSample02の実行結果 2
得点を入力してください。
70
合格発表を終わります。

if(条件)と複数の文を関連づけるにはブロックを使う。