継続条件如何に関わらずループを終了するためには break 文を使います。
break 文を使うと、そのループを強制的に抜けることができます。これによりループの終了を for や while 以外の場所で判断できるようになります。
while ((fgets(string, maxLength - 1, fp)) != NULL) { // end の文字があったらループを終了する if (lstrcmp(string, TEXT("end")) == 0) { break; } }
また、いつ終了するかわからないループを作る場合、 while の継続条件に1(または true )と書いて無限ループを作り、終了条件は if 文と break 文を組み合わせて作るという手法がよく使われます。
while (true) { // 前略 if (/* 難解な終了条件 */) { break; } // 後略 }
なお、 break 文は break 文が直接属するループのみを抜ける点に注意が必要です。たとえば2重ループの場合、中のループで break 文を書いても外側のループに処理が戻るだけです。
while (condition == true) { while (innerCondition == true) { if (/* 終了条件 */) { break; } } // ↑中のループで break したらここにくる }
中のループから外側のループまで抜けたい場合は、外側のループにも if 文が必要です。また goto 文を使う方法もあります。
while (condition == true) { while (innerCondition == true) { if (/* 終了条件 */) { goto endofloop; } } } endofloop: // ここに飛んでくる
ちなみに、 goto 文はこれ以外の用途で不用意に使うと批判の対象になってしまうため注意が必要です。
Comments
goto……
よく言われる言葉に「gotoは使うな!」という言葉がありますけど、だったらなぜgotoは未だにあるのか……
それは便利だからである。
多重ループから一気に抜け出すときgotoほど便利なものは無いですからね。
勿論、使いどころを間違えたgoto文は怖いですが、僕は今のところ多重ループから抜け出すときくらいにしか使っていないですね。
>たつにいさん
実は、このエントリ、たつにいさんのコードを見ているときに思いつきました。
そうなんですよね、多重ループ脱出に goto ほど便利なものはないです。
PHP とかだと goto が無いので大変で仕方ありません。
Contributions