C言語

場合分けの処理~switch編~

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文についてでした。

次は、繰り返し処理について学びます。

繰り返し処理~for文編~


-C言語