[C言語] switch文の使い方についてわかりやすく詳しく解説

C言語のswitch文は、複数の条件分岐を簡潔に記述するための制御構造です。

整数型の式を評価し、その結果に基づいてcaseラベルで指定されたブロックを実行します。

caseラベルの後には、実行したいコードを記述し、通常はbreak文でブロックを終了します。

break文がない場合、次のcaseラベルのコードも実行されるため注意が必要です。

また、どのcaseにも一致しない場合に実行されるdefaultラベルを指定することも可能です。

この記事でわかること
  • switch文の基本構造と動作原理
  • caseラベル、break文、defaultラベルの使い方
  • 数値や文字による条件分岐の実践例
  • switch文の利点と制限事項
  • switch文を用いた応用例とその実装方法

目次から探す

switch文の基本構造

switch文とは何か

C言語におけるswitch文は、複数の条件分岐を効率的に処理するための制御構造です。

if文と同様に条件に基づいて異なる処理を行いますが、特に複数の条件がある場合にコードをより見やすく整理することができます。

switch文は、特定の変数の値に基づいて、対応するcaseラベルの処理を実行します。

switch文の基本的な構文

switch文の基本的な構文は以下の通りです。

#include <stdio.h>
int main() {
    int number = 2; // 条件に使う変数
    switch (number) {
        case 1:
            printf("Number is 1\n");
            break;
        case 2:
            printf("Number is 2\n");
            break;
        case 3:
            printf("Number is 3\n");
            break;
        default:
            printf("Number is not 1, 2, or 3\n");
    }
    return 0;
}

この構文では、switchキーワードの後に続く括弧内の変数の値に基づいて、対応するcaseラベルの処理が実行されます。

break文は、処理が終わった後にswitch文を抜けるために使用されます。

defaultラベルは、どのcaseにも該当しない場合に実行される処理を定義します。

switch文の動作原理

switch文の動作原理は以下の通りです。

  1. switchキーワードの後に続く括弧内の式が評価されます。
  2. 評価された結果と一致するcaseラベルが見つかると、そのラベルに続く処理が実行されます。
  3. break文が実行されると、switch文を抜けます。

break文がない場合、次のcaseラベルの処理が続けて実行されます(フォールスルー)。

  1. どのcaseラベルにも一致しない場合、defaultラベルの処理が実行されます(defaultラベルは省略可能です)。

このように、switch文は特定の変数の値に基づいて効率的に条件分岐を行うことができ、コードの可読性を向上させるのに役立ちます。

switch文の使い方

caseラベルの使い方

caseラベルは、switch文の中で特定の値に対する処理を定義するために使用されます。

caseの後に続く値が、switch文の評価結果と一致した場合、そのcaseラベルに続くコードが実行されます。

caseラベルは整数型の定数式でなければなりません。

#include <stdio.h>
int main() {
    int day = 3; // 曜日を表す変数
    switch (day) {
        case 1:
            printf("Monday\n");
            break;
        case 2:
            printf("Tuesday\n");
            break;
        case 3:
            printf("Wednesday\n");
            break;
        default:
            printf("Invalid day\n");
    }
    return 0;
}

この例では、dayが3の場合、”Wednesday”が出力されます。

break文の役割

break文は、switch文の中で処理を終了し、switch文の外に制御を移すために使用されます。

break文がない場合、次のcaseラベルの処理が続けて実行される(フォールスルー)ため、意図しない動作を防ぐために通常は各caseの最後にbreak文を置きます。

#include <stdio.h>
int main() {
    int number = 2;
    switch (number) {
        case 1:
            printf("Number is 1\n");
            break;
        case 2:
            printf("Number is 2\n");
            break;
        case 3:
            printf("Number is 3\n");
            break;
    }
    return 0;
}

この例では、numberが2の場合、”Number is 2″が出力され、break文によってswitch文を抜けます。

defaultラベルの使い方

defaultラベルは、どのcaseラベルにも一致しない場合に実行される処理を定義します。

defaultラベルは省略可能ですが、すべての可能性をカバーするために使用することが推奨されます。

#include <stdio.h>
int main() {
    int number = 5;
    switch (number) {
        case 1:
            printf("Number is 1\n");
            break;
        case 2:
            printf("Number is 2\n");
            break;
        default:
            printf("Number is not 1 or 2\n");
    }
    return 0;
}

この例では、numberが1でも2でもないため、”Number is not 1 or 2″が出力されます。

複数のcaseをまとめる方法

複数のcaseラベルをまとめて同じ処理を行いたい場合、break文を使わずに連続してcaseラベルを記述することができます。

これにより、同じ処理を複数の条件で実行することができます。

#include <stdio.h>
int main() {
    int number = 2;
    switch (number) {
        case 1:
        case 2:
        case 3:
            printf("Number is 1, 2, or 3\n");
            break;
        default:
            printf("Number is not 1, 2, or 3\n");
    }
    return 0;
}

この例では、numberが1、2、または3の場合、”Number is 1, 2, or 3″が出力されます。

複数のcaseラベルをまとめることで、同じ処理を簡潔に記述できます。

switch文の実践例

数値による条件分岐の例

switch文は、数値による条件分岐に非常に適しています。

例えば、数値に基づいて異なるメッセージを表示するプログラムを作成することができます。

#include <stdio.h>
int main() {
    int score = 85; // スコアを表す変数
    switch (score / 10) {
        case 10:
        case 9:
            printf("Excellent\n");
            break;
        case 8:
            printf("Very Good\n");
            break;
        case 7:
            printf("Good\n");
            break;
        case 6:
            printf("Satisfactory\n");
            break;
        default:
            printf("Needs Improvement\n");
    }
    return 0;
}

この例では、スコアを10で割った結果に基づいて評価を表示します。

スコアが85の場合、”Very Good”が出力されます。

文字による条件分岐の例

switch文は、文字による条件分岐にも使用できます。

文字は整数として扱われるため、caseラベルに文字を指定することが可能です。

#include <stdio.h>
int main() {
    char grade = 'B'; // 成績を表す変数
    switch (grade) {
        case 'A':
            printf("Excellent\n");
            break;
        case 'B':
            printf("Good\n");
            break;
        case 'C':
            printf("Average\n");
            break;
        case 'D':
            printf("Below Average\n");
            break;
        case 'F':
            printf("Fail\n");
            break;
        default:
            printf("Invalid grade\n");
    }
    return 0;
}

この例では、gradeが’B’の場合、”Good”が出力されます。

列挙型とswitch文の組み合わせ

列挙型を使用すると、switch文でより意味のある条件分岐を行うことができます。

列挙型は、関連する定数をグループ化するために使用されます。

#include <stdio.h>
enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY };
int main() {
    enum Day today = WEDNESDAY; // 今日の日付を表す変数
    switch (today) {
        case MONDAY:
            printf("Start of the work week\n");
            break;
        case WEDNESDAY:
            printf("Midweek\n");
            break;
        case FRIDAY:
            printf("End of the work week\n");
            break;
        case SATURDAY:
        case SUNDAY:
            printf("Weekend\n");
            break;
        default:
            printf("Invalid day\n");
    }
    return 0;
}

この例では、todayWEDNESDAYの場合、”Midweek”が出力されます。

列挙型を使用することで、コードの可読性が向上し、意味のある条件分岐が可能になります。

switch文の利点と注意点

switch文の利点

switch文にはいくつかの利点があります。

  • 可読性の向上: 複数の条件分岐を整理して記述できるため、コードの可読性が向上します。

特に、同じ変数に対する複数の条件を扱う場合に有効です。

  • 効率的な実行: コンパイラによって最適化されることが多く、if文の連続よりも効率的に実行される場合があります。
  • 簡潔な記述: 複数のcaseラベルをまとめて同じ処理を行うことができるため、コードを簡潔に記述できます。

switch文の制限事項

switch文にはいくつかの制限事項もあります。

  • 整数型のみ対応: switch文で使用できるのは整数型の式のみです。

浮動小数点数や文字列を直接扱うことはできません。

  • 同じ値の重複不可: 同じ値を持つcaseラベルを複数定義することはできません。

caseラベルは一意である必要があります。

  • 範囲の条件分岐が難しい: if文のように範囲を指定した条件分岐ができないため、特定の範囲に対する条件分岐には不向きです。

switch文とif文の使い分け

switch文とif文は、どちらも条件分岐を行うための構造ですが、使い分けが重要です。

  • switch文を使うべき場合:
  • 同じ変数に対する複数の具体的な値を条件にする場合。
  • 条件が整数型であり、特定の値に対する処理を行う場合。
  • コードの可読性を重視し、複数の条件を整理したい場合。
  • if文を使うべき場合:
  • 条件が複雑で、範囲や論理演算を含む場合。
  • 条件が整数型以外(例えば、浮動小数点数や文字列)の場合。
  • 条件が少なく、switch文を使うほどのメリットがない場合。

このように、switch文とif文はそれぞれの特性を理解し、適切に使い分けることで、より効率的で可読性の高いコードを書くことができます。

switch文の応用例

メニュー選択プログラムの実装

switch文は、ユーザーが選択したメニューに応じて異なる処理を行うプログラムに適しています。

以下は、簡単なメニュー選択プログラムの例です。

#include <stdio.h>
int main() {
    int choice;
    printf("メニューを選択してください:\n");
    printf("1. 新規作成\n");
    printf("2. 開く\n");
    printf("3. 保存\n");
    printf("4. 終了\n");
    printf("選択: ");
    scanf("%d", &choice);
    switch (choice) {
        case 1:
            printf("新規作成を選択しました。\n");
            break;
        case 2:
            printf("開くを選択しました。\n");
            break;
        case 3:
            printf("保存を選択しました。\n");
            break;
        case 4:
            printf("終了します。\n");
            break;
        default:
            printf("無効な選択です。\n");
    }
    return 0;
}

このプログラムでは、ユーザーが入力した選択肢に応じて、対応するメッセージを表示します。

switch文を使うことで、メニューの選択肢を簡潔に管理できます。

状態遷移の管理

switch文は、状態遷移を管理する際にも役立ちます。

例えば、簡単な状態遷移を持つプログラムを作成することができます。

#include <stdio.h>
enum State { START, RUNNING, PAUSED, STOPPED };
int main() {
    enum State currentState = START;
    switch (currentState) {
        case START:
            printf("プログラムを開始します。\n");
            currentState = RUNNING;
            break;
        case RUNNING:
            printf("プログラムは実行中です。\n");
            break;
        case PAUSED:
            printf("プログラムは一時停止中です。\n");
            break;
        case STOPPED:
            printf("プログラムは停止しました。\n");
            break;
        default:
            printf("不明な状態です。\n");
    }
    return 0;
}

この例では、プログラムの状態に応じて異なるメッセージを表示します。

switch文を使うことで、状態遷移を明確に管理できます。

シンプルなコマンドラインインターフェースの構築

switch文は、シンプルなコマンドラインインターフェースを構築する際にも便利です。

以下は、基本的なコマンドラインインターフェースの例です。

#include <stdio.h>
int main() {
    char command;
    printf("コマンドを入力してください (h: ヘルプ, q: 終了): ");
    scanf(" %c", &command);
    switch (command) {
        case 'h':
            printf("ヘルプ: 使用可能なコマンドは h, q です。\n");
            break;
        case 'q':
            printf("プログラムを終了します。\n");
            break;
        default:
            printf("無効なコマンドです。\n");
    }
    return 0;
}

このプログラムでは、ユーザーが入力したコマンドに応じて、対応するメッセージを表示します。

switch文を使うことで、コマンドの処理を簡潔に記述できます。

よくある質問

switch文でbreakを忘れるとどうなる?

switch文でbreakを忘れると、フォールスルーと呼ばれる現象が発生します。

これは、指定されたcaseラベルの処理が終わった後、次のcaseラベルの処理が続けて実行されることを意味します。

意図しない動作を引き起こす可能性があるため、通常は各caseの最後にbreak文を入れることが推奨されます。

switch文でdefaultは必須ですか?

defaultラベルは必須ではありませんが、推奨されます。

defaultラベルを使用することで、どのcaseラベルにも一致しない場合の処理を定義できます。

これにより、予期しない入力やエラーを処理するための安全策として機能します。

switch文で複数のcaseを同じ処理にするにはどうすればいいですか?

複数のcaseラベルを同じ処理にするには、break文を使わずに連続してcaseラベルを記述します。

これにより、同じ処理を複数の条件で実行することができます。

例:case 1: case 2: printf("Same action\n"); break;のように記述します。

まとめ

switch文は、C言語における効率的な条件分岐を実現するための重要な構造です。

この記事では、switch文の基本構造、使い方、実践例、利点と注意点、応用例について詳しく解説しました。

switch文の特性を理解し、適切に活用することで、より効率的で可読性の高いプログラムを作成することができます。

ぜひ、実際のプログラミングでswitch文を活用してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • 繰り返し処理 (26)
  • 条件分岐 (27)
  • URLをコピーしました!
目次から探す