6.プログラムの制御

6-4. switch case による選択・分岐

◆スイッチによる選択・分岐

今まで、分岐にはif文を使い二者択一で制御してきました。
しかし、3択・4択となったときどうすれば良いでしょうか?
if文を多重化するのもひとつの手です。しかしそれではネストが深くなり、メンテナンスが煩雑になります。また単純にif文をならべる方法もあります。
これなら、ネストが深くならないで見た目わかりやすくなりますが、ほとんど同じような条件式を並べるのもあまり効率的ではありません。もちろん実行時においても必ずすべての条件を比較するので無駄な処理が発生します。

そこで、ifでは実現の大変な3択以上の分岐を行うキーワードとしてswitchがあります。

◇スイッチオン!

ます、スイッチの書式ですがswitchだけでなくcaseも使い場合によってはdefault,breakも使用します。

switch(条件){
case 定数: 文;
default: 文;
}

基本的には上の書式になります。(実際にはcase行が複数ある)
あとcaseやdefaultの横の文は複数書くこともできます。{中括弧}で囲む必要はありません。

それで、上の書式の説明ですがcaseの横の定数(文字定数でも式でも可)と条件(これは通常変数か式:もちろん現在値が条件の対象)が一致したとき右側の文を実行します。そしてdefaultはcaseのどれにも当てはまらないときに実行されます。

注意点として同じ値をもつcaseを2つ以上書かない、defaultは省略できるがこれも2つ以上書いてはいけません。なおdefaultを省略したときcaseと一致するものがなければ何もせずswitchを抜けます。

では、早速サンプルプログラムを組んでみます。

#include<stdio.h>

main()
{
    char c;
    printf("0から9の刻印のついたキーを押してエンターキーを");
    printf("押してください\n"); /* メールの都合上2行にしています */
    scanf("%c",&c);

    switch(c){
        case '0': printf("0のキーが押されました\n");break;
        case '1': printf("1のキーが押されました\n");break;
        case '2': printf("2のキーが押されました\n");break;
        case '3': printf("3のキーが押されました\n");break;
        case '4': printf("4のキーが押されました\n");break;
        case '5': printf("5のキーが押されました\n");break;
        case '6': printf("6のキーが押されました\n");break;
        case '7': printf("7のキーが押されました\n");break;
        case '8': printf("8のキーが押されました\n");break;
        case '9': printf("9のキーが押されました\n");break;
        default : printf("数字キー以外のキーを押されました\n");
    }
}

breakについては次の項目で説明します。