改めて前回の内容をおさらいをしておくと、
- for文は、()内のループ継続条件の記述が(1) ループの始点を記述するセクション(2)ループの終点を記述するセクション(3) {}内処理終了ごとの処理を記述するセクション の3つのセクションに分かれる。
- for文の()内のセクション1~3の記述は、省略することも可能。(ただし特殊な記述である事、無限ループが発生する可能性があることに留意する)
ということをお伝えしました。
今回はbreak演算子とcontinue演算子 についてお話ししたいと思います。
break演算子とは?
break演算子については、
第37回「switch文」のところでも、少しだけ登場し軽く触れました。↓
あたらめて説明すると、break演算子は
条件演算や繰り返し構文で使われる{}内の処理を途中で離脱する為に使われるものです。
※「条件演算子って何だったっけ?」という方は、↓の記事群をご覧ください
※「繰り返し構文ってなんだったっけ?」という方は、↓の記事群をご覧ください。
プログラムがbreak演算子に行き着くと、プログラムは最後まで{}内の記述を読み込まず、途中で直近の{}内を抜け出ます。
void OnStart()
{
for(int icounter=0;icounter<=5;icounter++)
{
//icounterが3だったら、for文のループを抜ける
if(icounter==3)break;
//0,1,2がログ出力される
Print(icounter);
}
}
for文の()内に記述されているループ継続条件は
0から5まで です。
したがって、
if(icounter==3)break;//icounterが3だったら、for文のループを抜ける
という記述がなければ、本来Print関数によるログ出力は0,1,2,3,4,5となる筈です。
しかし、icounterの値が3のループ時、break演算子の箇所で{}を離脱しているために、それ以降のログ出力は行われず、最終的なログ出力結果は「0,1,2」となっています。
while文や、do-while文、for文などの繰り返し構文の解説記事の中で
記述内容に気を付けないと、無限ループとなる危険性がある
ということを書いてきましたが、
繰り返し構文の()内に記述するループ継続条件は設定せず、無限ループ状態にしつつも、{}内でbreak演算子を使うことによって、無限ループにせずに特定条件下でループを終了させる記述が可能です。↓
void OnStart()
{
//ループカウント用の整数型変数「counter」を用意
int icounter=1;
//()内にループ継続条件は指定しない
for (;;)
{
//ログ出力
Print(icounter);//1,2,3,4,5が出力される
//icounterが5だったら、for文のループを抜ける
if(icounter==5)break;
icounter++;
}
}
for文の()内にループ継続条件は指定していないので、{}内にbreak演算子を入れることによって、
icounterが5だったら、for文のループを抜ける
という無限ループにならずに、ループ離脱する記述となりました。
補足 -break演算子の離脱範囲について-
switch文の解説記事の時にも書いたことなのですが、大事なことなので改めて書きます。
break演算子をもちいて離脱する{}はあくまで、break演算子が用いられた直近の{}だけです。
例えば↓
void OnStart()
{
//メインループ
for (int icounter=0;icounter<=5;icounter++)
{
//サブループ
for(int jcounter=0;jcounter<=5;jcounter++)
{
//ログ出力
Print("サブループ=",jcounter);//0,1,2が出力される
if(jcounter==2)break;
}
//ログ出力
Print("メインループ=",icounter);//0,1,2,3,4,5が出力される
}
}
上記のコードを見るとfor文の中にfor文が入っている入れ子状の構造(ネスト)になっています。
外側のメインループのループ回数を決定する変数が「icounter」
内側のサブループループ回数を決定する変数が「jcounter」
となっています。どちらも()内で定義しているループ範囲は0~3。
icounterが「0」のときにjcounterが「0,1,2」とループ処理をしていき、jcounterが「2」までいったらicounterが「1」になって、再度jcounterが「0,1,2・・・」と再度ループ処理をする、
そんな構造になっています。
icounter=0 jcounter=0
icounter=0 jcounter=1
icounter=0 jcounter=2
icounter=0 jcounter=3
icounter=1 jcounter=0
icounter=1 jcounter=1
icounter=1 jcounter=2
icounter=1 jcounter=3
・・・・以下略。
こんな感じで処理が行われていきます。・・・本来であれば
サンプルコードではサブループの部分に
という処理文を入れています。「jcounterの値が2になったらループを抜ける」という意味ですね。
このプログラムを実行すると以下のようになります。↓
「jcounterの値が2になったらループを抜ける」というbreak演算子の使い方をしているので、サブループのログ出力は「2」までしか表示されていない一方で、ループを抜けたのはあくまで内側のサブループfor文の{}です。
メインループのfor文には、break演算子の記述はないので、メインループはループが「3」まで継続している、というのがわかると思います。
continue演算子とは?
continue演算子は、break演算子と似たような役割を果たすのですが、
break演算子がループを完全に離脱し、以降のループを行わないのに対し、
continue演算子は特定の条件になったらスキップして次のループに移る
という挙動の違いがあります。
言葉だけではわかりづらいと思うのでコードで見てみましょう。
void OnStart()
{
int icounter=0;
//icounterの値が5より小さいか、5と同じまでループする
while (icounter<=5)
{
//インクリメント(icounterの値に1プラスする)
icounter++;
//icounterの値が3の時は処理をスキップする
if(icounter==3)continue;
//ログ出力
Print(icounter);//1,2,4,5,6 が出力される
}
}
順番に見ていきましょう。ループ継続条件は
while (icounter<=5)すなわち、
「icounterの値が5より小さいか、5と同じまで」
となっています。
{}内にてicounterの値をインクリメント(icounterの値に1プラスする)させ、その上でPrint関数にてicounterの値をログ出力する、という記述なのですが、
という記述によって、
icounterの値が3の時はcontinue演算子より下に書かれている{}内処理をおこなわず、whileループの最初に戻る
ということを意味しています。
whileループの最初に戻った後は、再び{}内冒頭のインクリメント記述によってicounterの値が4となり(=3でなくなり)、再びログ出力が開始される、という流れです。
ログ出力の結果は、「1,2,4,5,6」となります。
ちなみに、なぜ出力結果に「6」が含まれているのか、については大丈夫でしょうか?
icounterの値が5の時→まだ{}内のループは読み込む
↓
{}冒頭のインクリメントによってicounterの値が6になる
↓
↓
icounter=6なので、ループは終了
このような流れになっています。
まとめ
今回はbreak演算子とcontinue演算子について解説しました。
今回の記事では以下のことを学びました
- break演算子は、条件演算や繰り返し構文で使われる{}内の処理を途中で離脱する為に使う。
- continue演算子は特定の条件になったらスキップして次のループに移る動作をさせたい時に使う
今回は以上になります。
最後までお読みいただきありがとうございました<m(__)m>
コメント