ネストしたループとcontinue・break

こちらの投稿(continuebreak)で、while文やfor文を途中でスキップしたり中止したりできることについて説明しました。
また、こちらの投稿(while文・for文のネスト)でwhile文やfor文などのループ文はネストできる(重複して使用できる)ことについて説明しました。

では、ネストしたループ内でcontinueやbreakを用いた場合、プログラムはどのように動くのでしょうか。
ここではその動作について確認してみましょう。

動かしてみよう

では、サンプルコードを動かしてみましょう。
サンプルはwhile文・for文のネストで用いた九九の早見表出力プログラムに、適当な位置でbreak文を挿入したコードです。
外側のループにbreakを入れた場合と内側のループにbreakを入れた場合、それぞれについて動作をみてみましょう。
まずは外側のループでbreakさせた場合です。
入力欄への記入は不要なので、実行ボタンを押してみてください。

実行できましたか?
5の段まで出力させたところでbreakが実行され、処理が終わりましたね。

では続いて、内側のループでbreakさせてみましょう。

外側のループでbreakさせた場合と異なり、9の段まで処理がおこなわれましたが、各段とも ×5 以降の処理が止まっていますね。
break が9回実行されたことが出力結果から分かります。

では、解説に進みましょう。

解説

まずは外側のループでbreakさせた場合です。(一部の記述を省略しています。)

    for( int vertical = 1; vertical <= 9; vertical++ )
    {
        for( int horizontal = 1; horizontal <= 9; horizontal++)
        {
            処理;
        }
        if( vertical == 5) break;
    }
    /* break後、ここにくる。 */

上記の位置でbreakさせた場合、外側のループを抜けます。(上記のコメントで記した位置に処理が進みます。)
変数vertical と horizontal はおおまかに下記のような挙動をします。

vertical = 1
  horizontal = 1〜9
vertical = 2
  horizontal = 1〜9
 ・・・
vertical = 5
  horizontal = 1〜9
ここで break

これによって、5の段までしか表示されないという挙動になっていました。

では次に内側のループでbreakさせた場合です。(一部の記述を省略しています。)

    for( int vertical = 1; vertical <= 9; vertical++ )
    {
        for( int horizontal = 1; horizontal <= 9; horizontal++)
        {
            処理;
            if( vertical == 5) break;
        }
    /* break後、ここにくる。 */
    }

上記の位置でbreakさせた場合、内側のループを抜けます。(上記のコメントで記した位置に処理が進みます。)
つまり、外側のループからは抜けれていません。

変数vertical と horizontal はおおまかに下記のような挙動をします。

vertical = 1
  horizontal = 1〜5
  ここで break
vertical = 2
  horizontal = 1〜5
  ここで break
 ・・・
vertical = 9
  horizontal = 1〜5
  ここで break

これによって、各段が ×5 までしか表示されないという挙動になっていました。

ミスしがちな注意点として、内側のループでbreakさせたら外側まで抜けるという勘違い、があります。
continue や break で抜けれるループは、while または for ひとつ分だけです。
わりとみかけるミスなので、コーディング時には注意が必要です。

なお、サンプルではforとbreakを用いましたが、whileやcontinueについても同様です。(do〜whileも。)

まとめ

まとめです。

  • continue や break の効果は、while や for ひとつ分だけ。
  • ネストした while や for からは、continue や break 一回だけだと抜けられないので注意しよう。

以上です。
ではまた。

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