ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
プログラミングのはなし

if 文を間違える!

if 文はある条件が成立するか成立しないかを判定して分岐を行うものです。当たり前じゃないかって?しかし意外と誤解している人が多いのです!

次の例を見て下さい。

SAMPLE
CODE
// 挨拶する関数
// パラメータ:
//   1 ... "Hello!" と表示する
//   2 ... "Bye!" と表示する
void Say( int nWord )
{
    if ( nWord == 1 ) {
        puts( "Hello!" );
    }
    else {
        puts( "Bye!" );
    }
}

この例では、else 節に辿り着いたときに nWord が 2 以外の場合もあるかもしれないという可能性を忘れてしまっています。これでは呼び出し側のバグで規定外の値が入力されたときにも 2 が入力されたのと同じように動作してしまいます。その結果、バグの発見が遅れることになるでしょう。

次のようにするのが正解です。

SAMPLE
CODE
// 挨拶する関数
// パラメータ:
//   1 ... "Hello!" と表示する
//   2 ... "Bye!" と表示する
void Say( int nWord )
{
    ASSERT( ( nWord == 1 ) || ( nWord == 2 ) );

    if ( nWord == 1 ) {
        puts( "Hello!" );
    }
    else {
        puts( "Bye!" );
    }
}

ほんの1行追加しただけですが、これで不正な入力は完全にシャットアウトできます。もし呼び出し側が不正な値を入力すれば、即座にバグが検出されます(ASSERT については別のトピックで詳しく説明しています)。この1行が書けるようになるとプログラムの品質はぐんと向上します。

なお、あとで入力のバリエーションが増えると予測される場合は次のようにします。

SAMPLE
CODE
// 挨拶する関数
// パラメータ:
//   1 ... "Hello!" と表示する
//   2 ... "Bye!" と表示する
void Say( int nWord )
{
    switch ( nWord ) {

    case 1:
        puts( "Hello!" );
        break;

    case 2:
        puts( "Bye!" );
        break;

    default:
        ASSERT( false );
    }
}

(「プログラミングのはなし」は1998年1月から1999年1月にかけて作成されたコンテンツです。)