next up previous contents
Next: 15.3 課題 15 Up: 15. 制御構造 II Previous: 15.1 繰り返し

15.2 判断

判断については、我々は、if - else if - else 文を学習したが、多くの 選択子の中から選ぶ場合、if 文の構文はいささか面倒である。 例えば、次のような if 文による選択を考えてみる。

例1
        if ( input == 'h' ){
            x--;
        }else if ( input == 'j' ){
            y++;
        }else if ( input == 'k' ){
            y--;
        }else if ( input == 'l' ){
            x++;
        }

このプログラムでは、文字型の変数 input にキーボードから読みとった 文字の値が入っていて、それが 'h' だったら変数 x を一つ減らす、 'j' だったら変数 y を一つ増やすというような判断を行っている。 要するに、文字型変数 input の値によって対応する処理を行っているだけ なのだが、いちいち else if を用いて、input== という判断を しなければならないので、面倒であるし、ソースコードも見づらい。そこで、 こうした処理を簡単に書くための構文が用意されている。この新しい構文は、 switch - case 文あるいは簡単に switch 文( case 文と言う 事もある)と言い、上の例ならば、 次のように書くことが出来る。

例2(例1に同じ)
        switch(input){
            case 'h':   x--; break;
            case 'j':   y++; break;
            case 'k':   y--; break;
            case 'l':   x++; break;
        }

すなわち、switch に続く () の中に指定した変数の値について、 'h' ならば( case 'h': )、次に続く文を実行する。ここで、注意 するのは、break; である。これは、switch 文を抜けるための指示で ある。もし、break; がなければ、つぎの case 文の後の実行文に制御が移る。 いちいち、break; とするのは面倒なようだが、実はこれは非常に 便利なことがあるために、わざわざこうなっている。何故そうなっているのか、 次の例を見てみよう。

例3
        switch(input){
            case 'h':   x--; break;
            case 'H':   x--; break;
            case 'j':   y++; break;
            case 'J':   y++; break;
            case 'k':   y--; break;
            case 'K':   y--; break;
            case 'l':   x++; break;
            case 'L':   x++; break;
        }

この例では、入力文字が 'h' の場合と、'H' の場合とでは、同じ 処理を行っている。同じ処理を行うものはまとめて書いておけば便利であろう。 ここで、先の break; の説明を思い出して欲しい。break; がなければ、 次の case 文の後の実行文に移るのであるから、上の例は、次のように簡潔に 書くことが出来る。

例4(例3に同じ)
        switch(input){
            case 'h':
            case 'H':   x--; break;
            case 'j':
            case 'J':   y++; break;
            case 'k':
            case 'K':   y--; break;
            case 'l':
            case 'L':   x++; break;
        }

勿論、2行を一つの行にまとめて、次のように書いても良い。

例5(例4に同じ)
        switch(input){
            case 'h': case 'H':     x--; break;
            case 'j': case 'J':     y++; break;
            case 'k': case 'K':     y--; break;
            case 'l': case 'L':     x++; break;
        }

もしこれを if 文を用いて書いたならば、

例6(例5と同じ)
        if ( input == 'h' || input == 'H' ){
            x--;
        }else if ( input == 'j' || input == 'J' ){
            y++;
        }else if ( input == 'k' || input == 'K' ){
            y--;
        }else if ( input == 'l' || input == 'L' ){
            x++;
        }

のように、かなり見づらく長いプログラムになる。

  さて、switch 文の威力が分かったところで、switch 文の書式を まとめよう。

switch - case 文の書式

        switch ( 整数値をとる式 ){
            case 定数値 :   実行文;
            case 定数値 :   実行文;
            ...
            [default:]      実行文;
        }

switch 文は便利だが、整数値を持つ式にしか使えない点に注意しよう。 C 言語では、文字も整数値(実際には char で、少し整数型よりも小さい範囲の 値を持つのだが、実質的には今の場合問題はない)を持つので、 整数型と文字型にしか使えず、それが、 ある定数に一致するような場合にしか使用できない。また、case の後の 値は、定数でなければならないので、変数を使用することは出来ない(そのような 場合は、if 文を使うしかない)。また、if( x>0 ) のような 比較を判断する場合にも使えない訳である。

上の書式には、新しく default という文があるが、これは、if 文で 言うところの else に相当するもので、他の case のどれにも当ては まらない場合には、この default 以下の実行文が実行される。 つまり、例7の if - else if - else 文は例8のように書き換えられる。

例7
        if(i==1){
            enemy_test = rand()%3;
        }else if(i==2){
            enemy_test = rand()%2;
        }else{
            enemy_test = rand()%4;
        }

例8
        switch(i){
            case 1:  enemy_test = rand()%3; break;
            case 2:  enemy_test = rand()%2; break;
            default: enemy_test = rand()%4; break;
        }

switch 文で注意するのは、例4、5のようにわざと2つの case 文を つなげる場合以外は、必ず、break; で終わるようにする点である。 ( default: の場合もそうする。)文法的には、最後の ( } の直前の )case または default は、break; 文がなくても、switch 文から抜けるので良いように思われるが、この場合でも 後から case 文を付け足すことも考えて、常に break; 文を書く習慣 をつけておいた方が良い。



Noriyo Kanayama