C言語 switch文のdefault文は必ずつけるべし

  • このエントリーをはてなブックマークに追加
Pocket

多分岐処理を実行させるのにswitch文を使いますね。あなたはdefault文をつけていますか?

default文を書かなければ、思わぬエラーを引き起こしてしまう可能性があるので、必ず、default文を書くようにしましょう。

もし、default文がない場合、他のcase文で、実行されていればいいのですが、どこのcase文にもあてはまらなかった場合、変数に値が設定されていなかったり、ポインタが不正なアドレスを指し示したままということがあり得ます。

そうなると、プログラムが暴走したり、強制終了されてしまったりする可能性があるのです。

switch文でしか設定していない変数を見極める

まず、switch文の中でしか、設定していない変数が何なのかを、見極める必要があります。これをしないと、default文でどうするかが決まらないからです。

基本的にswitch文で何かの処理をさせたい場合、case文によって、処理の内容を変えるためなのは、もちろんのことなのですが、その処理の中で、変数の設定がcase文ごとに違う場合もあります。

さらに、switch文でしか変数の値を設定していないものがあったりもします。

そういう変数はdefault文で何か値を設定しておくべきです。

そうでなければ、その後の処理で、思いもよらぬ事態になりかねません。プログラムの暴走や強制終了といったことです。

switch文がどれかのcase文とマッチする前提で作ったとしたら、deafult文は変数は初期化しておくべきでしょう。

想定していない値がswitch文に来たということなので、それはswitch文にとって、エラーとなるわけです。

エラーになった場合は、変数を初期化しておくようにしておくことで、プログラムの暴走や、強制終了を防ぐことにつながるのです。

default文を省略してもいいときもある

もちろん、default文は省略が可能ですから、省略してもいいのです。

ただし、本当にdefault文がなくてもプログラムが暴走したり、強制終了したりすることがないという場合に限ります。

極端に言うと、switch文がなくてもプログラムが問題なく動作するような状態のときです。

例えば、

int i;

i = 0;
switch (i) {
    case 0:
        printf("case 0 を実行\n");
        break;

    case 1:
        printf("case 1 を実行\n");
        break;
    }
}

というような、case文に対して、以降の処理に問題がない場合のみ、default文を省略すればいいと思います。

私の場合は、明らかに、default文になることがない場合でも、default文を書くようにしています。

default文は省略せずに書く

結局のところ、default文を省略するメリットは、ほとんどありません。書かないことによるデメリットのほうが多いです。

デメリットは、先ほどから言っているように、プログラムの暴走、強制終了です。そうならなかったとしても、その先の処理で意図しない動作になる可能性もあるわけです。

そういうリスクをおかしてまで、default文を省略する理由がありません。

switchの判定条件の変数が、列挙型の変数であって、case文がすべての列挙子で書かれていたとしても、default文は書いておきましょう。

なぜなら、通常は、列挙子の値しか取りませんが、万が一、列挙型の変数のビットが何らかのハード的要因で、反転してしまって、想定外の値をとってしまう可能性が0ではないからです。

プログラムに絶対はありません。ありえない値が入っているかもしれないという心構えで、プログラムを書いていくべきです。

まとめ

switch文のdefault文は書くべきということをお話ししました。if文でいうところのelse文に相当する部分ですね。

やはり、それ以外の時の処理というのは重要になります。ですが、意外とおろそかにされている現状があります。

それゆえに、トラブルになっている事実もあるのです。

想定外を想定内にするようなプログラミングを心がけましょう。

ここまで読み進めてくれたあなたなら、きっとできるはずです。

ぜひ、想定外のことまで、考えられるプログラマーになってください。

  • このエントリーをはてなブックマークに追加

コメントを残す

*