switch文を使いこなせばプログラミングも楽々!C言語の分岐処理をマスター

2024-05-25

C言語におけるswitch文:詳細解説

概要

一般的に、if文の入れ子構造よりも簡潔で読みやすく、効率的な分岐処理を実現できます。

書き方

switch (式) {
  case1:
    処理1;
    break;
  case2:
    処理2;
    break;
  ...
  default:
    デフォルト処理;
}

解説

  1. switch (式): 式の値を評価します。式は整数型または文字列型である必要があります。
  2. case 値1:: 各分岐条件を示します。複数のcaseラベルを並べて記述できます。
  3. 処理1;: 各分岐条件に対応する処理を記述します。
  4. break;: 各分岐処理の終了を示します。breakがなければ、次のcaseラベルまで処理が実行されます。
  5. default:: 式の値がどのcaseにも一致しない場合の処理を記述します。省略することもできますが、記述しておくと望ましくない処理を防ぐことができます。

#include <stdio.h>

int main() {
  int num = 3;

  switch (num) {
    case 1:
      printf("1が出ました\n");
      break;
    case 2:
      printf("2が出ました\n");
      break;
    case 3:
      printf("3が出ました\n");
      break;
    default:
      printf("それ以外の数字が出ました\n");
  }

  return 0;
}

このプログラムでは、変数numの値に応じて、1、2、3が出た場合にそれぞれ異なるメッセージを出力します。

補足

  • breakは省略可能ですが、省略すると、次のcaseラベルまで処理が実行されてしまうため、必ず記述することを推奨します。
  • switch文は、効率的な分岐処理を実現できますが、複雑な分岐の場合は、if文の組み合わせの方が読みやすくなる場合があります。

C言語のswitch文は、条件分岐を簡潔かつ効率的に記述できる便利な制御構造です。基本的な書き方と注意点、そして実用的な例を理解することで、プログラムの可読性と保守性を向上させることができます。



    文字列による分岐

    #include <stdio.h>
    
    int main() {
      char day[] = "月曜日";
    
      switch (day[0]) {
        case '月':
          printf("おはようございます、月曜日\n");
          break;
        case '火':
          printf("おはようございます、火曜日\n");
          break;
        case '水':
          printf("おはようございます、水曜日\n");
          break;
        case '木':
          printf("おはようございます、木曜日\n");
          break;
        case '金':
          printf("おはようございます、金曜日\n");
          break;
        case '土':
          printf("おはようございます、土曜日\n");
          break;
        case '日':
          printf("おはようございます、日曜日\n");
          break;
        default:
          printf("曜日が不明です\n");
      }
    
      return 0;
    }
    

    複数のcaseラベルに共通する処理

    この例では、10以下の整数を3で割った余りによって、その数が何の倍数であるかを出力します。

    #include <stdio.h>
    
    int main() {
      int num = 8;
    
      switch (num % 3) {
        case 0:
        case 3:
          printf("%dは3の倍数です\n", num);
          break;
        case 1:
        case 2:
          printf("%dは3の倍数ではありません\n", num);
          break;
        default:
          printf("無効な数字です\n");
      }
    
      return 0;
    }
    

    fallthroughによる連続処理

    この例では、1から5までの整数を引数として受け取り、その数の累乗を計算して出力します。

    #include <stdio.h>
    
    int main() {
      int n = 3;
      int result = 1;
    
      switch (n) {
        case 5:
          result *= n; // fallthrough
        case 4:
          result *= n; // fallthrough
        case 3:
          result *= n;
          break;
        case 2:
          result *= n;
          break;
        case 1:
          result *= n;
          break;
        default:
          printf("無効な数字です\n");
      }
    
      printf("%dの累乗は %d です\n", n, result);
    
      return 0;
    }
    

    これらの例は、C言語におけるswitch文の様々な使用方法を示しています。状況に応じて適切な書き方を選択することで、プログラムをより読みやすく、効率的にすることができます。

    • 複数のswitch文を組み合わせることもできます。
    • switch文の中にif文を記述することもできます。
    • switch文の代わりにif文を使用する方が適切な場合もあります。


    C言語におけるswitch文の代替方法

    if文

    最も基本的な分岐処理の方法です。switch文よりも柔軟性が高く、複雑な条件分岐にも対応できます。

    if (条件) {
      処理1;
    } else if (条件2) {
      処理2;
    } else {
      処理3;
    }
    

    if-else if-else構造

    複数の条件分岐を階層的に記述する方法です。switch文よりも読みやすく、理解しやすいコードになります。

    if (条件1) {
      処理1;
    } else if (条件2) {
      処理2;
    } else if (条件3) {
      処理3;
    } else {
      処理4;
    }
    

    ネストされたif文

    条件が複雑に絡み合っている場合に使用する方法です。ただし、可読性が低下する可能性があるため、注意が必要です。

    if (条件1) {
      if (条件2) {
        処理1;
      } else {
        処理2;
      }
    } else {
      if (条件3) {
        処理3;
      } else {
        処理4;
      }
    }
    

    goto文

    特殊な制御構造であり、非推奨です。プログラムの構造が複雑になり、保守性が低下する可能性があるため、よほどの理由がない限り使用すべきではありません。

    goto label1;
    
    label1:
      処理1;
    
      if (条件2) {
        goto label2;
      }
    
      処理3;
    
    label2:
      処理4;
    

    三項演算子

    シンプルな条件分岐を簡潔に記述する方法です。ただし、複雑な条件分岐には対応できません。

    int result = (条件) ? 値1 : 値2;
    

    関数ポインタ

    各分岐処理を関数として定義し、関数ポインタを使用して呼び出す方法です。高度なプログラミングテクニックであり、理解と使いこなしに難易度が高いです。

    typedef void (*FunctionPtr)(void);
    
    FunctionPtr funcPtrs[] = {
      処理1関数,
      処理2関数,
      処理3関数,
    };
    
    int num = 2;
    
    funcPtrs[num]();
    

    マクロ

    条件分岐をマクロとして定義する方法です。コードの簡潔化に役立ちますが、可読性が低下する可能性があるため、注意が必要です。

    #define 処理1 if (条件1) { ... }
    #define 処理2 else if (条件2) { ... }
    #define 処理3 else { ... }
    
    処理1;
    処理2;
    処理3;
    

    switch文は汎用性の高い制御構造ですが、状況によっては他の方法の方が適している場合があります。それぞれの方法の特徴とメリット・デメリットを理解し、適切な方法を選択することが重要です。