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


一般的に、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が出た場合にそれぞれ異なるメッセージを出力します。

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

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;
}

この例では、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文の代わりにif文を使用する方が適切な場合もあります。
  • switch文の中にif文を記述することもできます。
  • 複数の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;