caseと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」の後の定数との比較して一致した位置からということになるわけです。
break文
前述した通り「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」の名前で保存します。まずコンパイルを行います。
コンパイルが終わりましたら「test7-1」と入力して実行します。
今回は「break」文がありませんので「case 2」に一致した後の全ての処理が実行されています。
( Written by Tatsuo Ikura )