【C++】ifとswitchの使い分けとは?|違いと選び方をわかりやすく解説

サムネイル画像 C++

今回は、C++での「if と switch の使い分け」について解説していきます。

「どっちを使えばいいの?」「switchってどんな時に使うの?」と迷ったことはありませんか?

この記事を読み終えると、あなたはifとswitchを正しく使い分けられるようになると思いますので、ぜひ最後まで読んでいただけると嬉しいです。

if文とswitch文の違い

if文どんな条件でも書ける万能な分岐です。

switch文1つの変数の値が何かで分岐する専門家です。

それぞれの特徴を詳しく見ていきましょう。

if文の特徴

if文は、柔軟性が高く、どんな条件でも書けるのが最大の特徴です。

if文で使える条件の例

▼範囲の判定

#include <iostream>

int main() {
    int score = 75;
    
    if (score >= 60 && score < 80) {
        std::cout << "良\n";
    }
    
    return 0;
}

▼複数の変数を組み合わせ

#include <iostream>

int main() {
    int age = 20;
    bool hasLicense = true;
    
    if (age >= 18 && hasLicense == true) {
        std::cout << "運転できます\n";
    }
    
    return 0;
}

▼文字列の比較

#include <iostream>
#include <string>

int main() {
    std::string name = "Tanaka";
    
    if (name == "Tanaka") {
        std::cout << "田中さんですね\n";
    }
    
    return 0;
}

▼小数の判定

#include <iostream>

int main() {
    double height = 170.5;
    
    if (height >= 170.0) {
        std::cout << "170cm以上\n";
    }
    
    return 0;
}

このように、if文はあらゆる条件に対応できます

if文のデメリット

分岐が多いと、else ifが連続して読みにくくなるのが欠点です。

▼main.cpp

#include <iostream>

int main() {
    int cmd = 3;
    
    // こうなると見づらい...
    if (cmd == 1) {
        std::cout << "新規作成\n";
    } else if (cmd == 2) {
        std::cout << "開く\n";
    } else if (cmd == 3) {
        std::cout << "保存\n";
    } else if (cmd == 4) {
        std::cout << "閉じる\n";
    } else if (cmd == 5) {
        std::cout << "終了\n";
    } else {
        std::cout << "無効なコマンド\n";
    }
    
    return 0;
}

このような場合、switchを使う方が見やすくなります

switch文の特徴

switch文は、1つの変数の値が何かで分岐するときに使います。

▼main.cpp

#include <iostream>

int main() {
    int cmd = 3;
    
    switch (cmd) {
        case 1:
            std::cout << "新規作成\n";
            break;
        case 2:
            std::cout << "開く\n";
            break;
        case 3:
            std::cout << "保存\n";
            break;
        case 4:
            std::cout << "閉じる\n";
            break;
        case 5:
            std::cout << "終了\n";
            break;
        default:
            std::cout << "無効なコマンド\n";
    }
    
    return 0;
}

実行結果

保存

if文よりも構造が明確で読みやすくなっていますね。

switchで使える型

switchで使える型には制限があります

  • 整数型:int, char, short, long など
  • 列挙型:enum
  • 小数型:double, float(使えない)
  • 文字列:std::string(基本的に使えない)

▼使えない例

#include <iostream>

int main() {
    // これはエラー!
    double x = 1.5;
    // switch (x) {  // 小数はダメ
    //     case 1.5:
    //         break;
    // }
    
    // これもエラー!
    std::string s = "hello";
    // switch (s) {  // 文字列はダメ
    //     case "hello":
    //         break;
    // }
    
    return 0;
}

小数や文字列で分岐したい場合は、if文を使う必要があります

breakを忘れると?(フォールスルー)

switchでは、breakを書かないと次のcaseも実行されてしまいます

▼main.cpp

#include <iostream>

int main() {
    int n = 1;
    
    switch (n) {
        case 1:
            std::cout << "1\n";
            // breakがない!
        case 2:
            std::cout << "2\n";
            break;
        case 3:
            std::cout << "3\n";
            break;
    }
    
    return 0;
}

実行結果

1
2

case 1だけでなく、case 2も実行されてしまいました

これをフォールスルーと呼びます。

フォールスルーを活用する場合

フォールスルーは、複数のcaseで同じ処理をしたい時に便利です。

▼main.cpp

#include <iostream>

int main() {
    char grade = 'B';
    
    switch (grade) {
        case 'A':
        case 'B':
        case 'C':
            std::cout << "合格\n";
            break;
        case 'D':
        case 'F':
            std::cout << "不合格\n";
            break;
    }
    
    return 0;
}

実行結果

合格

これは「A, B, C のどれかなら合格」という意味になります。

実践的な使い分け例

曜日による処理(switch推奨)

▼main.cpp

#include <iostream>

int main() {
    int dayOfWeek = 3; // 1=月, 2=火, 3=水...
    
    switch (dayOfWeek) {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            std::cout << "平日\n";
            break;
        case 6:
        case 7:
            std::cout << "週末\n";
            break;
        default:
            std::cout << "無効な曜日\n";
    }
    
    return 0;
}

成績の判定(if推奨)

▼main.cpp

#include <iostream>

int main() {
    int score = 85;
    
    // 範囲判定なのでifを使う
    if (score >= 90) {
        std::cout << "優\n";
    } else if (score >= 80) {
        std::cout << "良\n";
    } else if (score >= 70) {
        std::cout << "可\n";
    } else {
        std::cout << "不可\n";
    }
    
    return 0;
}

if vs switch 比較表

比較項目ifswitch
範囲の判定(<, >= など)×
複数条件(&&, ||)×
文字列の比較×
小数の比較×
整数値の一致判定
分岐が多いときの見やすさ
処理速度(分岐が多い場合)普通速いことが多い

どちらを使うべき?

以下の基準で選びましょう。

こういうとき使うべきもの
範囲や複雑な条件で判定したいif
文字列や小数で分岐したいif
整数や文字の値で3つ以上に分岐switch
メニュー選択、曜日、状態遷移などswitch
迷ったらif

switchは使える場面が限られますが、ハマると断然見やすくなります

まとめ

ifswitchの使い分けをまとめます。

  • ifどんな条件でも書ける万能型。範囲や文字列、複雑な条件に対応
  • switch整数値による分岐専門。分岐が多いと見やすい
  • switchで使えるのは整数型とenumのみ
  • switchではbreakを忘れずに(フォールスルーに注意)
  • 迷ったらifを使えばOK

これでifとswitchの使い分けはバッチリですね!

適切な方を選んで、読みやすいコードを書いてみてください。

ここまで読んでくださり、ありがとうございました。

この記事が皆様の学習に役立てば幸いです。