if~else if~else文と同じように、複数の条件に応じた処理を行うことができるswitch文という構文があります。
このswitch文は、変数の値毎に処理を分けたい場合に使用します。
例えば、変数が1の場合は~処理、変数が2の場合は~処理、という感じに処理を行いたい場合です。
switch文の使い方
switch文の構文は次のようになります。
構文
switch( 式 )
{
case 定数1:
文1 ;
break ;
case 定数2:
文2 ;
break ;
default:
文3 ;
break ;
}
式には、変数名が記述されます。
switch文では、式にある変数の値とcase文の定数値と一致すれば、そのあとの文からbreakまでを実行します。
break文は、switch文で使用する場合、switch文を終了することになります。
どのcase文の定数値にも当てはまらない場合は、defaultのあとの文から処理を行います。
なお、defaultは省略可能です。
次にサンプルプログラムを示します。
#include <stdio.h>
int main(void)
{
int number;
scanf("%d", &number);
switch( number )
{
case 1:
printf("1が入力されました。¥n");
break;
case 2:
printf("2が入力されました。¥n");
break;
default:
printf("1,2以外が入力されました。¥n");
break;
}
printf("終了します。¥n");
return 0;
}
サンプルプログラムを実行して、1、2、3をそれぞれ入力した実行結果を次に示します。
実行結果
1 ←入力したデータ
1が入力されました。
終了します。
実行結果
2 ←入力したデータ
2が入力されました。
終了します。
実行結果
3 ←入力したデータ
1,2以外が入力されました。
終了します。
1を入力した場合、case 1:の下の文から実行され、その下のbreak; でswitch文が終わります。
2を入力した場合、case 2:の下の文から実行され、その下のbreak; でswitch文が終わります。
1,2以外を入力した場合、default:の下の文から実行されることがわかると思います。
上のサンプルプログラムは、if文に置き換えることができます。
if文に置き換えると次のようになります。
#include <stdio.h>
int main(void)
{
int number;
scanf("%d", &number);
if( number == 1 )
{
printf("1が入力されました。¥n");
}
else if( number == 2 )
{
printf("2が入力されました。¥n");
}
else
{
printf("1,2以外が入力されました。¥n");
}
printf("終了します。¥n");
return 0;
}
いかがでしょうか、if文でもswitch文でも結果は同じです。
このくらいの条件なら、どちらを使用してもよいと思います。個人的にはこれ以上条件が増えるのであれば、switch文のほうが見やすいと思います。
また、今後、条件が増える可能性があるときは、switch文にすると思いますし、これ以上条件が増えることがない場合は、if文にするかもしれませんが、どちらを使うかは、臨機応変に考えればよいと思います。
switch文は、 変数の値と、case文の定数値が一致している場合のみ、処理が行われます。しかし、複数のcase文で同じ処理をさせたい場合があると思います。そんなときは、case文を連続して記述することで、実現可能になります。
次に、複数のcase文で同じ処理をさえるサンプルプログラムを示します。
#include <stdio.h>
int main(void)
{
int number;
printf("0~9の数値を入力してください。\n");
scanf("%d", &number);
switch( number )
{
case 1:
printf("1が入力されました。\n");
break;
case 2:
case 3:
case 4:
case 5:
printf("2~5のいずれかが入力されました。\n");
break;
default:
printf("1~7以外が入力されました。\n");
break;
}
return 0;
}
case 2~case 5が連続して記述されています。このようにすることで、numberに2~5を入力すると、すべて、「2~5のいずれかが入力されました。」と表示されることが確認できると思います。
これは、式の値とcase文の値が一致しているところにジャンプして、その下の文からbreak文までを実行するというswitch文の仕組みになっているため、このような動作になります。
サンプルプログラムでは、caseの定数値が昇順にならんでいますが、必ずしも順番にする必要はありません。
break文があるまで処理が行われるため、break文を記述し忘れると予期しない動きとなりますので、注意が必要です。
予期しない動きのサンプルプログラムを次に紹介します。
#include <stdio.h>
int main(void)
{
int number;
printf("0~9の数値を入力してください。\n");
scanf("%d", &number);
switch( number )
{
case 1:
printf("1が入力されました。\n");
case 2:
printf("2が入力されました。\n");
break;
default:
printf("1,2以外が入力されました。\n");
break;
}
return 0;
}
このサンプルプログラムでは、case 1:のprintf文の下にbreak文がなく、case文があります。
このサンプルプログラムを実行し、1を入力した結果は次のようになります。
実行結果
0~9の数値を入力してください。
1 ←入力したデータ
1が入力されました。
2が入力されました。
予想通りだったかもしれませんが、case 1:とcase 2:の間にbreak文がないため、1を入力すると、case 1:にジャンプして、そこからbreak文まで実行するため、case 2の処理も実行されてしまいました。
このようにbreak文を忘れると想定外の動きになってしまうため、注意が必要です。
なお、あえてbreak文をつけないで、次のcase文の処理も行いたい場合があると思います。しかし、break文を付け忘れているのか、意図的にしているのかがわかりにくくなってしまうため、このような書き方はしないほうがよいと思います。
以上が、C言語のswitch文についてでした。
次は、繰り返し処理について学びます。