switch文の中でbreak文を利用する

switch 文では対象の変数の値を複数の値と順に比較していくことができますが、 switch 文の中で break 文を使用するとより柔軟に処理を分岐させることができるようになります。ここでは C 言語の switch 文の中で break 文の利用方法について解説します。

(Last modified: )

break文を利用する

switch 文はある値を用意したいくつかの値と比較して一致した場所の処理を実行するために利用します。

switch(式){
  case 定数1:
    式が定数1の時に実行する処理1;
    式が定数1の時に実行する処理2;
    break;
  case 定数2:
    式が定数2の時に実行する処理1;
    式が定数2の時に実行する処理2;
    break;
  default:
    どの定数にも一致しない時に実行する処理1;
    どの定数にも一致しない時に実行する処理2;
}

case のあとの定数に一致すると、その後に記述された処理を実行します。処理は複数の行を記述することができます。ところで if 文の時は括弧 {} を使ってどこからどこまでが同じブロックなのかを明示していましたが switch 文では括弧は使いません。実は switch 文は次のように記述されているような構造となっています。

switch(式){
    式が定数1の時に実行する処理1;
    式が定数1の時に実行する処理2;
    break;
    式が定数2の時に実行する処理1;
    式が定数2の時に実行する処理2;
    break;
    どの定数にも一致しない時に実行する処理1;
    どの定数にも一致しない時に実行する処理2;
}

switch 文の括弧 {} 内に記述されている処理は、普通のプログラムを記述する時と同じように上から下へ順番に処理が行われます。そして switch 文ではどこからどこまでを実行するというのではなく、どこから開始するのかだけを決めています。そしてどこから開始するのかの目印となるのが case です。

switch(式){
  case 定数1:     /* 開始位置 1 */
    式が定数1の時に実行する処理1;
    式が定数1の時に実行する処理2;
    break;
  case 定数2:     /* 開始位置 2 */
    式が定数2の時に実行する処理1;
    式が定数2の時に実行する処理2;
    break;
  default:        /* 開始位置 3 */
    どの定数にも一致しない時に実行する処理1;
    どの定数にも一致しない時に実行する処理2;
}

例えば「開始位置1」から開始した場合には「開始位置1」から一番下まで実行します。「開始位置2」から開始した場合には「開始位置2」から一番下まで実行します。どの開始位置から開始するのかは「式」と case のあとの定数との比較して一致した位置からということになるわけです。

switch 文は指定した開始位置から一番下まで実行されるわけですが、実際にはそうなりません。それは break 文によってブロックの外へ抜けているためです。

break 文は実行されるとブロックを抜けて次の処理へ移ります。 switch 文においては switch 文の括弧 {} が内に各処理が記述されており break 文も同じです。そこで break 文が実行されると break 文が含まれているブロックの外側へ、つまり switch 文の次の処理へ進みます。

switch(式){
  case 定数1:
    式が定数1の時に実行する処理1;
    式が定数1の時に実行する処理2;
    break;    /* switchの次の処理へ */

  case 定数2:
    式が定数2の時に実行する処理1;
    式が定数2の時に実行する処理2;
    break;    /* switchの次の処理へ */

  default:
    どの定数にも一致しない時に実行する処理1;
    どの定数にも一致しない時に実行する処理2;
}

printf("次の処理\n");

それぞれの case の最後の処理として break 文が記述されています。最後に記述された default には break 文がありませんが、これはたまたま最後に記述されているために次の処理へ進める記述をあえてしなくてもいいためです。

switch 文ではただ開始位置だけを指定してそれから先は一番下まで処理が実行されると記述しましたが break 文があるおかげで任意の位置で switch 文の処理を終了できるわけです。

ちなみに break 文が無い場合を考えてみます。

switch(式){
  case 定数1:
    式が定数1の時に実行する処理1;
    式が定数1の時に実行する処理2;

  case 定数2:
    式が定数2の時に実行する処理1;
    式が定数2の時に実行する処理2;

  default:
    どの定数にも一致しない時に実行する処理1;
    どの定数にも一致しない時に実行する処理2;
}

このサンプルで「式」が「定数1」に一致した場合には「式が定数1の時に実行する処理1;」から「どの定数にも一致しない時に実行する処理2;」までの全ての処理が実行されます。

サンプルコード

では簡単なサンプルプログラムを作成して試してみます。

#include <stdio.h>

int main(void){
  int num;

  num = 2;
  printf("num = %d\n",num);

  switch(num){
    case 1:
      printf("数値は1です\n");
    case 2:
      printf("数値は2です\n");
    case 3:
      printf("数値は3です\n");
    default:
      printf("他の値です\n");
  }

  return 0;
}

上記を「test7-1.c」の名前で保存します。まずコンパイルを行います。

caseとbreakの詳細

コンパイルが終わりましたら「test7-1」と入力して実行します。

caseとbreakの詳細

今回は「break」文がありませんので「case 2」に一致した後の全ての処理が実行されています。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。