if文と論理演算子

目次
  • 解説
  • 1. 条件分岐とif文
  • 2. else文
  • 3. else-if文
  • 4. 並列と入れ子
  • 5. 論理演算子
問題に挑戦!
進捗を変更する




解説

1. 条件分岐とif文


条件分岐とは、既にこれまでの学習でも見てきたように、「もし~ならば」という条件文によってその後の処理を枝分かれさせることです。この枝分かれを実現するのがif文(イフ文)という構文です。「if」は英語で「もしも」のことです。

次のサンプルコードはif文の最も単純な形です。キーワード「if」に続く丸括弧の中がtrueである場合のみ、丸括弧に続くブロックの中身が実行されます。

    static void practiceIf() {
        if (true) {
            Logger.out("ifに続く丸括弧内がtrueだから実行された!");
        }
    }

丸括弧の中身をfalseに書き換えると、3行目が絶対に実行されないことを示す「dead code」という警告が表示され、コンパイルエラーとなることを確認しておきましょう。

この丸括弧内に論理値型の変数や、論理値型の結果を返す条件式・メソッド呼出を入れることで、その条件に応じて処理を切り替えられます。次のサンプルコードの条件をいろいろ書き換えてみて、ブロック内の実行を制御できることを確認しておきましょう。

    static void practiceIf() {
        int calculationResult = 1 + 2;
        boolean condition = (calculationResult < 4);
        if (condition) { // 論理値型の変数を入れた場合
            Logger.out("論理値型変数の中身がtrueだから実行された!");
        }
        if (calculationResult < 4) { // 条件式を直接入れた場合
            Logger.out("条件式の評価結果がtrueだから実行された!");
        }
        if ("a".equals(new String("a"))) { // メソッド呼出を入れた場合
            Logger.out("メソッドの戻り値がtrueだから実行された!");
        }
    }

2. else文


if文では「ある条件を満たす場合に実行する」ブロックを作成することができましたが、「それ以外の場合に実行する」ブロックを作成するには、else文を使用します。

次のサンプルコードのように、if文のブロックに続けてキーワード「else」とブロックを書くことで、if文に続く丸括弧内がfalseだった場合の処理を書くことが可能です。

    static void practiceElse() {
        boolean condition = false;
        if (condition) {
            Logger.out("条件はtrue!");
        } else {
            Logger.out("条件はtrueではない!");
        }
    }

3. else-if文


分岐させたい条件が複数ある場合には、else-if文を使用することが可能です。

次のサンプルコードのように、if文のブロックに続けてキーワード「else」を書き、さらに、続けてif文を書くことで条件を増やすことができます。このelse-if文はいくつでも繋ぐことが可能ですが、上から順番に丸括弧内の条件式の評価が行われ、trueとなったブロックを実行したらそれ以降を無視して終了(if文・else-if文・else文の次の行に移る)となります。

なお、else文はif文・else-if文全体に対してひとつのみ書くことができ、「どの条件式のブロックにも入らなかった場合」に実行されるブロックとなります。

    static void practiceElseIf() {
        boolean conditionA = false;
        boolean conditionB = true;
        boolean conditionC = true;
        if (conditionA) {
            Logger.out("conditionAがtrueだから実行された!");
        } else if (conditionB) {
            Logger.out("conditionBがtrueだから実行された!");
        } else if (conditionC) {
            Logger.out("conditionCがtrueだから実行された!");
        } else {
            Logger.out("conditionA~Cがすべてfalseだから実行された!");
        }
    }
[2020/12/31 12:34:56.789] conditionBがtrueだから実行された!
// conditionCもtrueだが、先に7行目が評価され8行目が実行されたためそこで終了

4. 並列と入れ子


前項のサンプルコードのelse-if文をただのif文3つにしてみましょう。

    static void practiceFlatten() {
        boolean conditionA = false;
        boolean conditionB = true;
        boolean conditionC = true;
        if (conditionA) {
            Logger.out("conditionAがtrueだから実行された!");
        }
        if (conditionB) {
            Logger.out("conditionBがtrueだから実行された!");
        }
        if (conditionC) {
            Logger.out("conditionCがtrueだから実行された!");
        }
    }

すると、今度は12行目も実行されましたね。では次に、else-if文を使わず、else文を使って、前項と同じ処理結果となるように組み直してみます。

    static void practiceNest() {
        boolean conditionA = false;
        boolean conditionB = true;
        boolean conditionC = true;
        if (conditionA) {
            Logger.out("conditionAがtrueだから実行された!");
        } else { // conditionAがfalseのためここに入る
            if (conditionB) {
                Logger.out("conditionBがtrueだから実行された!");
            } else { // conditionBがtrueのためここには入らない
                if (conditionC) {
                    Logger.out("conditionCがtrueだから実行された!");
                } else {
                    Logger.out("conditionA-Cがすべてfalseだから実行された!");
                }
            }
        }
    }

このようにif文は、並列にするのか、入れ子にするのか、else-if文によって繋げるのかによって、結果も読みやすさも大きく変わりますので、複雑にならないように注意が必要です。

5. 論理演算子


これまでに出てきた条件式には、比較演算式がひとつしかありませんでした。これでは複雑な条件分岐をすべてif文の組み合わせで表現しなくてはなりませんので、比較演算式を組み合わせる方法を学習しましょう。

比較演算式は評価されると結局は論理値となりますので、論理値の状態から新たな論理値の状態を導き出す論理演算子を使って結果を組み合わせます。

論理演算子用例評価結果
&&A && BAとBが両方ともtrueの場合にのみ true
A かつ B /論理積And(アンド)と読む
||A || BAとBのどちらかがtrueの場合に true
A または B /論理和Or(オア)と読む
!!A
!(A && B)
trueをfalseに、falseをtrueに反転させる
Not(ノット)論理否定と読む

実際に必要になるまではピンと来ないと思いますが、次のサンプルコードを確認して、使い方をイメージしておきましょう。

    static void practiceComplex() {
        String weekday = "火曜";
        boolean isHoliday = true;
        if (weekday == "土曜" || weekday == "日曜") {
            Logger.out("土曜と日曜は22時まで営業!");
        } else if (weekday == "火曜" && isHoliday) {
            Logger.out("火曜でも祝日は営業!");
        } else if (weekday == "火曜" && !isHoliday) {
            Logger.out("祝日でない火曜は定休日");
        } else {
            Logger.out("通常は21時まで営業中!");
        }
    }
[2020/12/31 12:34:56.789] 火曜でも祝日は営業!

問題

確認問題


確認問題1

次のコードを実行したとき、変数aの値が最終的に2となる
A, B, Cの組み合わせはどれか?

        boolean A = ?;
        boolean B = ?;
        boolean C = ?;
        int a = 0;
        if (A && B) {
            a += 1;
        } else if (B && C) {
            a += 2;
        } else if (!(A || C)) {
            a += 3;
        } else {
            a += 4;
        }
        Logger.out(a);