【C++学習|初心者向け】C++初心者必見!whileループで「無限ループ」を避けるためのcontinueの注意点

1. 導入:なぜこの知識が重要なのか

C++の学習を始めると、必ずと言っていいほど直面するのが「ループ処理」です。特にwhileループは条件式が単純な反面、制御を誤るとプログラムが止まらなくなる「無限ループ」を引き起こしやすいという側面があります。今回は、ループをスキップする便利な命令「continue」を使う際に、初心者が陥りやすい典型的なバグと、その解決策について解説します。

2. 基礎知識:whileループとcontinueとは

whileループは、指定した条件が「真(true)」である限り、中身の処理を繰り返し実行する構文です。

一方、continueは「現在の周回の処理を中断し、次のループの先頭へジャンプする」という命令です。特定の条件の時だけ処理をスキップしたい場合に非常に役立ちます。しかし、この「次のループの先頭へジャンプする」という挙動が、更新処理の場所と組み合わさると、思わぬバグを生む原因になります。

3. 実装/解決策:更新処理の順序を守る

無限ループが発生する最大の原因は、「ループ変数の更新(インクリメントなど)」よりも前に「continue」を記述してしまうことです。

continueが実行されると、その後の行はすべて無視されてループの条件判定に戻ります。つまり、変数が更新されないまま条件判定に戻るため、条件式が常に真のままで固定されてしまうのです。解決策はシンプルで、変数の更新処理は「continueよりも前」に配置するか、更新のタイミングを適切に管理することです。

4. サンプルプログラム

以下のコードは、continueの使い方を誤った例(無限ループ)と、正しく修正した例です。

include <iostream>

int main() {
    // 【危険な例:無限ループになる】
    // int i = 0;
    // while(i < 5) {
    //     if(i == 2) continue; // ここで戻ると i は 2 のまま更新されない!
    //     std::cout << i << std::endl;
    //     ++i; 
    // }

    // 【正しい例:更新を先に行う】
    int i = 0;
    while(i < 5) {
        // 先にインクリメントを行うことで、スキップしても変数は確実に進む
        ++i; 

        if(i == 3) {
            std::cout << "3はスキップします" << std::endl;
            continue; // i=3のときだけ表示を飛ばす
        }
        
        std::cout << "現在の値: " << i << std::endl;
    }

    return 0;
}

5. 応用・注意点:現場で役立つアドバイス

現場の開発では、whileループよりもforループを使うことが推奨されるケースが多いです。forループであれば、for(int i = 0; i < 5; ++i)のように、定義・判定・更新がひとまとめになっているため、今回のような「更新し忘れによる無限ループ」を構造的に防ぐことができます。 もしwhileループを使う必要がある場合は、「変数の更新をどこで行うのが最も安全か?」を常に意識してください。また、万が一プログラムが止まらなくなった場合は、Ctrl + Cキーで強制終了できることを覚えておくと、デバッグ時に非常に役立ちます。基本に忠実なコードを書くことが、バグを防ぐ一番の近道です。

コメント

タイトルとURLをコピーしました