[前へ]   [目次へ]   [次へ]

breakとcontinue(前編)(C/C++)

今回は、ループを中断する break 、ループを再実行する continue についてです。

前々回、3回前の各ループの実行手順リスト中に、
「 break を実行した場合」「 continue を実行した場合」というのがありました。
今回の内容はこの部分についてです。
また、 break 、 continue 共に、C/C++キーワードです。

まず、 break についてです。
以前、 switch でも break を使用したことがありました。
ループ中で使用する break も基本的には同じ扱いで、直近のループの終了位置から続行します。

また、 break はループの継続条件を評価しません。
問答無用でループを終了します。(この辺は実行手順リストを見ればわかりますね)
そのため無限ループを作った時は break 等を置くことでループを終了できるようになります。

まとめると、 break は実行位置を実行位置から最も近い switch for while do のいずれかのブロックの終点に移動させます。
if else 等のブロックや単体のブロックなどは無視されます。
したがって、以下のコードは正しくループを終了します。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
< 13>
< 14>
< 15>
< 16>
< 17>
#include <stdio.h>

int main(void)
{
   
int i;
   
for(i=1;;i++){//(1)継続条件がないので無限ループします
      
printf("%d回目のループ実行中\n",i);//(2)iはループするたびに数が増えていきます。
      
if(i>5){//(3)iが5より大きい、6週目に真になります。
         
break;//(4)ループをbreakします。
      }
      puts(
"ループブロック終端です");//(5)breakしたら実行されません。
   }
   puts(
"ループが終わりました。");//(6)
   //終了待ち
   
getchar();
   
return 0;
実行結果:
1回目のループ実行中
ループブロック終端です
2回目のループ実行中
ループブロック終端です
3回目のループ実行中
ループブロック終端です
4回目のループ実行中
ループブロック終端です
5回目のループ実行中
ループブロック終端です
6回目のループ実行中
ループが終わりました。


(1)6行目は継続条件が書いていない for ループです。
for は継続条件が無い場合無条件に真として扱うことになっています。
そのため、このループはこのままでは終了しません。
ループを終了するために break か return を仕込まなければいけません。

(2)7行目は現在のループの回数を表示します。
初回式で1を代入され、続行式で1づつ加算されている変数 i はもちろんループブロック内でも参照可能です。
参照できなかったらループなんて大した使い道がなくなりますから、当然といえば当然です。

(3)8行目は9行目の break の実行に条件をつけています。
何も条件を掛けずに break してしまったら意味がありません(普通に書いたのとほとんど同じになってしまう)。
break は if ブロックを無視して、ループブロックの終点にジャンプします。

(4)9行目の break は8行目の if と合わさって、 i>5 が成立したらループを終了という扱いになります。
この場合、 if の条件はループの終了条件に当たるため、ループの「継続条件」が苦手でしょうがないというのなら、
無限ループにしておいてループブロックの先頭で if break を組み合わせるという方法もあります。

(5)10行目の puts は、 break が実行された回では実行されていないのが結果から分かります。
break が実行されるとブロック内のそれ以降のコードは全て飛ばされているということです。
このputsはこの解説のためだけに置いてあります(笑)

(6)12行目は break が実行された後の続行位置の確認用です。
break はループブロックが終了したところから続行されるので9行目で break が実行されると次は12行目を実行します。


ループの中にループを作った場合は break は一番近い対象ブロックの終点に移動します。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
< 13>
< 14>
< 15>
< 16>
< 17>
< 18>
< 19>
< 20>
< 21>
< 22>
< 23>
< 24>
< 25>
< 26>
#include <stdio.h>

int main(void)
{
   
while(1){//whileで無限ループ。
      
puts("ループ1起点");
      
while(1){//2個目の無限ループ
         
puts("ループ2起点");
         
switch(1){//switchまで置いてみます。
         
case 1://これは絶対成立。
            
puts("switch");
            
break;//switchを終了します。
         }
         puts(
"switch完了");
         
break;//ループ2を終了します。
         
puts("ループ2終点");
      }
      puts(
"ループ2完了");
      
break;//ループ1を終了します。
      
puts("ループ1終点");
   }
   puts(
"ループが終わりました。");
   
//終了待ち
   
getchar();
   
return 0;
実行結果:
ループ1起点
ループ2起点
switch
switch完了
ループ2完了
ループが終わりました。

break は一番近いところの対象ブロックだけを終了していることが分かります。
ちなみに、複数段を一度に break する方法はありません。
できるとかなり便利だと思うんですけどねぇ・・・今後に期待(笑)


長くなったので continue は後編で(笑)。

[前へ]   [目次へ]   [次へ]

プログラミング講座 総合目次

最終更新 2008/10/17