switch文

1つの値に基づいて複数の処理を分岐させる

概要

switch文は、 1つの値に対して複数の値と比較して処理を分ける機能です。

if-else if を多く連ねるよりも、 読みやすいコードになることがあります。

switch文の基本形

switch (値) {
    case 値1:
        // 値が値1の場合ここが実行
        break;
    case 値2:
        // 値が値2の場合ここが実行
        break;
    default:
        // どの値にも合致しない場合
        break;
}

簡単な例

#include <iostream>

int main() {
    int day = 1;
    
    switch (day) {
        case 1:
            std::cout << "月曜日" << std::endl;
            break;
        case 2:
            std::cout << "火曜日" << std::endl;
            break;
        case 3:
            std::cout << "水曜日" << std::endl;
            break;
        default:
            std::cout << "その他の曜日" << std::endl;
            break;
    }
    
    return 0;
}

実行結果:
月曜日

day が 1 にマッチするので、 case 1 のブロックが実行されます。

switch文の重要なポイント: break文

break文は、 switch文をすぐに抜けるための文です。

break がないと、マッチしたケースから後続のすべてのケースが実行されます。 これをフォールスルーと呼びます。

break なしの例(悪い例)

#include <iostream>

int main() {
    int day = 1;
    
    switch (day) {
        case 1:
            std::cout << "月曜日" << std::endl;
            // break がない!
        case 2:
            std::cout << "火曜日" << std::endl;
        case 3:
            std::cout << "水曜日" << std::endl;
            break;
        default:
            std::cout << "その他" << std::endl;
    }
    
    return 0;
}

実行結果:
月曜日
火曜日
水曜日

break がないため、 case 1 以降すべてが実行されました。 通常、これは望ましくありません。

break ありの例(正しい例)

switch (day) {
    case 1:
        std::cout << "月曜日" << std::endl;
        break;  // ここで抜ける
    case 2:
        std::cout << "火曜日" << std::endl;
        break;
    default:
        std::cout << "その他" << std::endl;
}

フォールスルーが役立つケース

通常は break を忘れてはいけませんが、 意図的にフォールスルーを使う場合もあります。

例: 複数の値に同じ処理

int day = 2;  // 2 = 火曜日

switch (day) {
    case 1:  // 月
    case 2:  // 火
    case 3:  // 水
    case 4:  // 木
    case 5:  // 金
        std::cout << "平日です" << std::endl;
        break;
    case 6:  // 土
    case 7:  // 日
        std::cout << "休日です" << std::endl;
        break;
}

実行結果:
平日です

switch vs if-else

同じ変数と複数の値を比較するなら switch を使う 比較のほうが読みやすい場合が多いです。

状況 推奨 理由
1つの変数と複数の値を比較 switch 読みやすい、効率良い
複雑な条件(<, >,論理演算子等) if-else 複雑な判定はswitch では難しい

例: if-else で書く場合

int day = 1;

if (day == 1) {
    std::cout << "月曜日" << std::endl;
} else if (day == 2) {
    std::cout << "火曜日" << std::endl;
} else if (day == 3) {
    std::cout << "水曜日" << std::endl;
} else {
    std::cout << "その他" << std::endl;
}

このコードは switch で書く方が短く、読みやすい。

switch文で使える値の型

switch 文では、以下の型が使用できます:

  • int(整数)— 最も一般的
  • char(文字)
  • string(文字列)— C++11以降

char を使った例

#include <iostream>

int main() {
    char grade = 'B';
    
    switch (grade) {
        case 'A':
            std::cout << "優秀" << std::endl;
            break;
        case 'B':
            std::cout << "良好" << std::endl;
            break;
        case 'C':
            std::cout << "可" << std::endl;
            break;
        default:
            std::cout << "評価外" << std::endl;
    }
    
    return 0;
}

良好

ポイント

  • switch文は1つの値と複数の値を比較
  • break文で switch を抜ける(忘れやすい!)
  • defaultはどれにも合致しないときの処理
  • 複合条件は if-else を使う

よくある誤り

誤り1: break を忘れる

case 1:
    std::cout << "1" << std::endl;
    // break; を忘れた!→ 次のケースも実行

誤り2: switch内で変数宣言

switch (x) {
    case 1:
        int y = 10;  // NG: スコープの問題
        break;
    case 2:
        // y は使えない
}

// OK: break ありのブロックで。
switch (x) {
    case 1: {
        int y = 10;
        break;
    }
}

誤り3: 範囲での比較

switch (age) {
    case 0 to 17:  // NG: これはできない
        std::cout << "未成年" << std::endl;
        break;
}

// OK: if-else を使う
if (age >= 0 && age <= 17) {
    std::cout << "未成年" << std::endl;
}

やってみよう

練習1: 月の番号(1〜12)を入力させ、その月の日数を出力。

練習2: ユーザーから計算機の操作を受け付ける(+, -, *, /)。

チャレンジ: 選択メニュー(1: 足す、2: 引く、3: 掛ける、4: 割る)を作成。

ヒント

switch文で選択肢ごとに処理を分ける。

まとめ

  • switch文で1つの値と複数の値を比較
  • breakを忘れずに書く
  • defaultですべてに合致しないケースを処理
  • 複雑な条件は if-else が適切