C言語

条件文(switch文)

C言語には、if文の他に、条件によって処理を分けることができるswitch文があります。
今回は、このswitch文の基本的な使い方を解説します。

switch文の仕組み

switch文の構文は、次の通りです。

switch( 式 ) {
  case 定数1:
    文1;
    break;
  case 定数2:
    文2;
    break;
  default:
    文3;
    break;
}

switch文の括弧の中には、計算式や変数などを書きます。
この式の結果の値が、caseに書かれた定数と一致すると、その下のが実行されます。
文は break; と到達するまで実行され、break; が実行されるとswitch文全体の処理が終了します。
式の結果が、どのcaseの定数にも一致しない場合は、defaultの下の書かれたが実行されます。
もし、defaultを書いていない場合は、どのcaseの定数にも当てはまらなければ何も実行されず、switch文の処理は終了します。
default文は省略することもできますが、予期しない値に対しての処理を行うために書いておくことをおすすめします。

次のソースコードを記述して、いろんな整数値を入力して試してみてください。
入力した整数が「1」、「2」の場合で、それぞれに対応したメッセージが表示され、それ以外の整数を入力した場合は、defaultの文のメッセージが表示されます。

#include <stdio.h>

int main(void)
{
  int number;
  
  printf("整数を入力してください。\n");
  scanf("%d", &number);
  
  switch(number) {
    case 1:
      printf("1が入力されました。\n");
      break;
    case 2:
      printf("2が入力されました。\n");
      break;
    default:
      printf("その他の値が入力されました。\n");
      break;  
  }
  
  return 0;
}

break文を省略した場合

switch文の式がcaseの定数に該当した場合、そのcase以下の文から、break文があるところまでが実行されます。
では、このbreak文がない場合、どうなるでしょうか。
次のソースコードは、先ほどのプログラムから、一部のbreak文を削除したものです。

#include <stdio.h>

int main(void)
{
  int number;
  
  printf("整数を入力してください。\n");
  scanf("%d", &number);
  
  switch(number) {
    case 1:
      printf("1が入力されました。\n");
    case 2:
      printf("2が入力されました。\n");
      break;
    default:
      printf("その他の値が入力されました。\n");
      break;  
  }
  
  return 0;
}

次に、このプログラムを実行し、「1」を入力した結果です。

整数を入力してください。
1
1が入力されました。
2が入力されました。

本来なら、「1が入力されました。」だけが表示されるはずですが、
case 1: 下に break がないため、次のcase 2: の処理まで続けて実行されています。
このように、break を書き忘れると、次のcaseの処理まで実行されてしまう(フォールスルー(fall through))ため、意図しない動作になることがあります。
そのため、breakの書き忘れには注意しましょう。

このプログラムのように、case 1: の処理を行って、case 2: の処理を行うような、「順に複数のcaseの処理を行う」の書き方は、可読性や保守性の観点から推奨されておりません。これは、break文が意図的に記述していないのか、break文を忘れているのかが、第三者が判断しにくくなるためです。
なお、C言語ではあえてbreakを書かずに、複数のcase に対して同じ処理をすることは問題ありません。

複数のcaseに対して同じ処理をする

先ほど、「複数のcase に対して同じ処理をすることは問題ありません。」と説明しましたが、具体的な例を示します。
次のプログラムでは、0、1、2 のいずれかを入力しても同じメッセージが表示されます。

#include <stdio.h>

int main(void)
{
  int number;
  
  printf("整数を入力してください。\n");
  scanf("%d", &number);
  
  switch(number) {
    case 0:
    case 1:
    case 2:
      printf("2以下が入力されました。\n");
      break;
    default:
      printf("その他の値が入力されました。\n");
      break;  
  }
  
  return 0;
}

このように、複数の定数に対して同じ処理を行いたい場合は、case を連続して記述することでまとめ処理することができます。

このような書き方は、break を省略してもよい唯一のケースであり、処理の内容が同じ場合にのみ使うようにしましょう。

まとめ

  • switch文は、1つの式の結果に応じて処理を分けるときに使う。
  • switch文の括弧の中には、整数の値になる式(変数や計算式など)を書くことができる。
  • caseには定数(リテラル値や定義済み定数など)を指定し、式の結果と一致したところから処理が実行される。
  • caseの処理の最後には、break;を書いてswitch文を終了させる。
  • break;を書かないと、次のcaseの処理まで実行される(フォールスルー)ため、意図しない動作の原因になる。
  • defaultは、どのcaseにも一致しなかったときに実行される処理
  • defaultは省略可能ですが、想定外の値に備えるために書いておくのが望ましい
  • 複数のcaseで同じ処理を行いたいときは、caseを連続して書くことでまとめて処理できる。
    ※この場合だけ、break を省略してよい。

-C言語