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

for 文を間違える!

C/C++ 言語の for 文は while 文の拡張版です。初期化と次の状態への遷移方法を記述できるようになった while 文であるといえます。

for ( 初期化; ループ条件; 遷移 ) { ... }

これは BASIC などの FOR 文と大きく違う点です。

まず、次の悪い例を見て下さい。

SAMPLE
CODE
int nSum;
int i;
for( i=1, nSum=0; i<100; nSum+=i, i++ );

for 文の初期化と遷移の部分はループ条件に関係するものだけ書くようにすべきです。上の例では変数 i がこれにあたります。変数 nSum はループ条件とは無関係であり、このような書き方をするとわかりづらくなってしまいます。次のようにするのが正解です。

SAMPLE
CODE
int nSum = 0;
int i;
for( i=1; i<100; i++ ) {
    nSum += i;
}

行数が増えることを嫌う人もいるようですが、どちらの方が理解しやすいかを考えればこのようにすべきなのは明らかです。はじめの悪い例のような書き方をしていてはバグが大量に発生することになるでしょう。わざとややこしい書き方をして「オレってファンキーだぜ」なんて自己満足しないでください、お願いです!

これは while 文でも同じことです。while のループ条件に長いカンマ式を書いているコードをよく見かけますが、この場合もループ条件以外のものを条件式に書かないようにします。

なお、現実のプログラミングでは、上の i のように局所的にしか使っていない変数は次のようにブロックで囲んでスコープを制限します(詳しいことは別のトピックで説明した通りです)。

SAMPLE
CODE
int nSum = 0;
{
    int i;
    for( i=1; i<100; i++ ) {
        nSum += i;
    }
}

余談ですが、無限ループを書くときにも for 文を使用します。

SAMPLE
CODE
for (;;) { // 無限ループ
    ...
    if ( ... ) {
        break;
    }
    ...
}
無限ループを作るときによく

while (1) { ... }

とやっているのを見かけますが、良くないのでやめるようにして下さい。このような書き方をすると、優秀なコンパイラは「条件式の評価結果が常に一定です」というようなワーニングを出力します。

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