C++のbreak文は、現在実行中のループ文またはswitch文を途中で終了するための制御文です。
ループの中で使うと、その時点で繰り返し処理を終了し、ループの次の処理へ進みます。
switch文の中で使うと、現在のcaseの処理を終えて、switch文の外へ抜けます。
重要なのは、breakは単に「ブロックを抜ける文」ではないという点です。
C++では、{}で囲まれた範囲をブロックと呼ぶことがありますが、breakは任意のブロックから抜けられるわけではありません。
breakで抜けられるのは、基本的に次のような構造です。
- for文
- while文
- do while文
- switch文
つまり、より正確に言うと、break文は現在の位置を囲んでいる最も内側のループ文またはswitch文を終了する文です。
break文の基本的な役割
ループを途中で終了する
break文は、ループを最後まで実行せず、条件を満たした時点で処理を打ち切りたい場合に使います。
たとえば、1から10まで順番に処理するループがあったとしても、途中で目的の値が見つかった場合、それ以降の処理を続ける必要がないことがあります。
そのような場合にbreakを使うと、無駄な繰り返しを避けることができます。
代表的な使い方は、次のような場面です。
- 探している値が見つかったらループを終了する
- ユーザーが終了用の入力をしたら処理を止める
- 条件を満たした時点で、それ以上の繰り返しが不要になった
- 無限ループの中で、特定条件になったら抜ける
このように、breakは「もうこれ以上ループを続ける必要がない」と判断したときに使う文です。
switch文のcaseを終了する
break文は、switch文でもよく使われます。
switch文では、ある値に応じて複数のcaseの中から処理を選びます。
ただし、caseの処理が終わったあとにbreakを書かないと、次のcaseの処理まで続けて実行されることがあります。
この動きをフォールスルーと呼びます。
フォールスルーは意図的に使うこともありますが、初心者のうちは書き忘れによるバグの原因になりやすいです。
そのため、switch文では、次のcaseへ処理を流したくない場合、通常は各caseの最後にbreakを書きます。
ただし、必ずすべてのcaseにbreakが必要というわけではありません。
caseの中で関数を終了する処理や、別の場所へ制御を移す処理がある場合は、breakが不要なこともあります。
break文が使える場所
for文の中
for文の中でbreakを使うと、そのfor文を途中で終了できます。
for文は、回数が決まっている繰り返し処理でよく使われます。
しかし、実際には「最大で10回繰り返すが、途中で条件を満たしたら終了する」というようなケースもよくあります。
そのような場合にbreakを使うと、必要なタイミングでループを抜けられます。
たとえば、配列やリストの中から特定の値を探す場合、目的の値が見つかったあとは、それ以上探し続ける必要がありません。
このような探索処理では、breakを使うことで処理を効率化できます。
while文の中
while文の中でもbreakは使えます。
while文は、条件が成り立っている間、処理を繰り返す構文です。
特に、あえて終了条件を固定せず、処理の途中で条件を判断して抜けたい場合にbreakが役立ちます。
たとえば、ユーザー入力を繰り返し受け取り、特定の値が入力されたら終了するような処理では、while文とbreakの組み合わせがよく使われます。
また、無限ループを作っておき、内部の条件判定で必要に応じて抜けるという書き方もあります。
ただし、無限ループを使う場合は、必ずどこかで終了できる条件を用意する必要があります。
終了条件がないと、プログラムが止まらなくなる可能性があります。
do while文の中
do while文の中でもbreakを使えます。
do while文は、最初に処理を実行し、そのあとで条件を判定するループです。
そのため、最低1回は処理が実行されます。
do while文の中でbreakが実行されると、末尾の条件判定まで進まずに、すぐにループ全体を終了します。
ここは少し注意が必要です。
「条件がまだ成り立っていても終了する」という説明でも意味は伝わりますが、より厳密には、breakが実行された時点で、次の条件判定自体を行わずにループを抜けます。
つまり、breakはループ条件よりも強く、即座にループを終了させる制御文だと考えると分かりやすいです。
switch文の中
switch文の中でbreakを使うと、現在のcaseの処理を終えてswitch文全体から抜けます。
switch文では、該当するcaseが見つかると、その位置から処理が始まります。
そして、breakがない場合は、次のcaseへ処理が流れていくことがあります。
この動きは、場合によっては便利です。
たとえば、複数のcaseで同じ処理を行いたい場合には、あえて途中にbreakを書かず、複数のcaseをまとめることがあります。
一方で、意図していないフォールスルーはバグの原因になります。
そのため、switch文を書くときは、「ここで処理を終えるべきか」「次のcaseへ流してよいのか」を必ず意識する必要があります。
break文で抜ける範囲
抜けるのは最も内側のループまたはswitch文
break文で特に重要なのは、抜ける範囲です。
breakは、現在の位置を囲んでいる最も内側のループ文またはswitch文だけを終了します。
たとえば、ループが二重になっている場合、内側のループでbreakを使っても、外側のループまでは終了しません。
内側のループだけが終了し、その後、外側のループは続きます。
これは初心者がよく勘違いしやすいポイントです。
二重ループの中でbreakを使うと、ループ全体から抜けたように感じるかもしれません。
しかし、実際に終了するのは、breakに最も近い内側のループだけです。
ループの中にswitch文がある場合
ループの中にswitch文がある場合も注意が必要です。
たとえば、for文の中にswitch文があり、そのswitch文のcase内でbreakを使った場合、終了するのはfor文ではなくswitch文です。
つまり、ループの中で使われているbreakであっても、そのbreakがswitch文の中にあるなら、基本的にはswitch文だけを抜けます。
このケースでは、外側のループはそのまま続きます。
そのため、ループそのものを終了したいのか、switch文だけを終了したいのかを区別する必要があります。
二重ループ全体を抜けたい場合
C++のbreak文は、1つだけでは二重ループ全体を一気に抜けることはできません。
二重ループ全体を終了したい場合は、別の工夫が必要です。
代表的な方法としては、次のようなものがあります。
- フラグ変数を使う
- 処理を関数に分けてreturnで抜ける
- gotoを使う
一般的には、フラグ変数を使う方法や、関数に分けてreturnする方法がよく使われます。
gotoを使えば複数のループを一気に抜けることもできますが、使い方によっては処理の流れが分かりにくくなります。
そのため、実務では慎重に使うべきです。
break文とcontinue文の違い
breakはループを終了する
breakは、ループそのものを終了します。
つまり、breakが実行された時点で、そのループの残りの処理も、次回以降の繰り返しも行われません。
たとえば、1から5まで処理するループの中で、3になった時点でbreakした場合、3以降の処理は行われません。
ループはそこで完全に終了します。
breakは、「もうこのループを続ける必要がない」という場合に使います。
continueは次の繰り返しへ進む
一方、continueはループそのものを終了するわけではありません。
continueは、現在の回の処理だけをスキップして、次の繰り返しへ進みます。
たとえば、1から5まで処理するループの中で、3のときだけcontinueした場合、3の処理だけが飛ばされ、4や5の処理は続きます。
つまり、breakとcontinueの違いは次のように整理できます。
breakは、ループを終了する文です。
continueは、現在の繰り返しだけをスキップする文です。
この2つは似ているようで、動きは大きく異なります。
break文を使うメリット
無駄な処理を減らせる
breakを使う大きなメリットは、無駄な処理を減らせることです。
たとえば、大量のデータの中から1件だけ目的のデータを探す場合、見つかったあとも最後まで調べ続ける必要はありません。
目的のデータが見つかった時点でbreakすれば、それ以降の不要な処理を省けます。
データ数が少ない場合は大きな差にならないかもしれません。
しかし、データ量が多い場合や、処理が重い場合には、breakによって効率が大きく変わることもあります。
処理の終了条件を分かりやすく書ける
breakを使うと、「この条件を満たしたら終了する」という意図を明確に表現できます。
特に、ループの先頭条件だけでは終了条件を表しにくい場合に便利です。
たとえば、ユーザー入力を受け取り続ける処理では、入力内容を見てから終了するかどうかを判断することがあります。
この場合、ループの条件式だけですべてを表現しようとすると、かえって読みにくくなることがあります。
そのようなとき、ループの中で条件を判定し、必要ならbreakで抜けると、処理の流れが分かりやすくなります。
無限ループから安全に抜けられる
breakは、無限ループと組み合わせて使われることも多いです。
無限ループは、条件式だけを見ると永遠に続くように見えます。
しかし、ループの内部で終了条件を判定し、条件を満たしたらbreakすることで、安全に抜けられます。
この書き方は、入力待ち処理やメニュー処理などでよく使われます。
ただし、終了条件を書き忘れると本当に止まらないループになるため、無限ループを使う場合は、どの条件でbreakするのかを明確にしておくことが重要です。
break文を使うときの注意点
使いすぎると処理の流れが分かりにくくなる
breakは便利ですが、使いすぎるとコードの流れが分かりにくくなることがあります。
1つのループの中に複数のbreakがあると、どの条件でループが終了するのかを追いにくくなります。
もちろん、複数の終了条件があること自体は珍しくありません。
しかし、条件が多すぎる場合は、条件式を整理したり、処理を関数に分けたりした方が読みやすくなることがあります。
特に実務では、コードは自分だけでなく他の人も読む可能性があります。
そのため、breakを使う場合は、「なぜここで終了するのか」が自然に分かる書き方を意識するとよいです。
if文だけの中では使えない
breakは、単独のif文の中で使うことはできません。
ただし、これは「if文の中にbreakを書いてはいけない」という意味ではありません。
正確には、そのif文がループ文またはswitch文の中にある必要があります。
つまり、ループの中で条件判定としてif文を使い、その中でbreakするのは正しい使い方です。
一方で、周囲にfor文、while文、do while文、switch文がない状態でbreakを書くとエラーになります。
breakはif文を抜けるための文ではありません。
あくまで、ループ文またはswitch文を終了するための文です。
breakは関数を終了しない
breakは、関数を終了する文ではありません。
ループの中でbreakを使うと、そのループは終了します。
しかし、ループのあとに処理が続いていれば、その処理は実行されます。
関数そのものを終了したい場合は、breakではなくreturnを使います。
この違いは重要です。
breakは、現在のループまたはswitch文を終了します。
returnは、関数そのものを終了します。
二重ループ全体を抜けたい場合や、特定条件で処理全体を終わらせたい場合には、関数に分けてreturnを使う方が分かりやすいこともあります。
switch文でbreakを書き忘れるとフォールスルーする
switch文では、breakの書き忘れに注意が必要です。
caseの最後にbreakを書かないと、次のcaseの処理まで続けて実行されることがあります。
これがフォールスルーです。
フォールスルーは、意図的に使えば便利です。
たとえば、複数のcaseで同じ処理を行いたい場合には、あえて処理をまとめることがあります。
しかし、意図していないフォールスルーはバグにつながります。
そのため、switch文では、次のcaseに処理を流したいのか、それともそのcaseで終了したいのかを明確にする必要があります。
C++17以降では、意図的なフォールスルーであることを示すための仕組みもあります。
これを使うと、他の開発者やコンパイラに対して、「ここは書き忘れではなく、意図的に次のcaseへ進ませている」と伝えることができます。
実務でよくあるbreak文の使い方
探索処理で使う
breakは、探索処理でよく使われます。
たとえば、配列やリストの中から特定の値を探す場合、目的の値が見つかったら、それ以上探す必要はありません。
その時点でbreakすれば、不要な処理を省けます。
ただし、実務では「見つかった場合」だけでなく、「見つからなかった場合」の処理も必要になることが多いです。
そのため、見つかったかどうかを記録する変数を用意したり、関数にして結果を返したりする書き方がよく使われます。
入力処理で使う
ユーザーからの入力を繰り返し受け取る処理でも、breakはよく使われます。
たとえば、特定の値が入力されたら終了する、エラーが発生したら処理を止める、といった場面です。
このような処理では、while文や無限ループの中で入力を受け取り、終了条件を満たしたらbreakする形がよく使われます。
ただし、実際の入力処理では、ユーザーが想定外の値を入力する可能性もあります。
数値を入力してほしい場面で文字列が入力されると、入力処理が失敗することがあります。
そのため、実務的なコードでは、breakだけでなく、入力が成功したかどうかの確認も必要になります。
メニュー処理で使う
コンソールアプリなどで、メニューを表示してユーザーに操作を選ばせる処理でもbreakはよく使われます。
たとえば、ユーザーが「終了」を選んだらループを抜ける、という処理です。
メニュー処理では、何度も同じ選択肢を表示し、ユーザーの入力に応じて処理を分岐します。
そして、終了が選ばれたときだけbreakでループを抜ける、という構成がよく使われます。
このような使い方は、breakの典型例のひとつです。
break文とC++のスコープ
breakでスコープを抜けるとオブジェクトは破棄される
C++では、スコープの中で作られたオブジェクトは、そのスコープを抜けるときに破棄されます。
breakでループを抜ける場合も同じです。
ループ内で作られたローカルオブジェクトがあれば、ループを抜けるときに適切に破棄されます。
これはC++の重要な性質です。
初心者向けのbreak説明では深く扱わなくても問題ありませんが、C++ではbreakによって制御が移動しても、必要な後片付けは行われると理解しておくとよいです。
breakの後の同じブロック内の処理は実行されない
breakが実行されると、すぐに対象のループ文またはswitch文を抜けます。
そのため、同じブロック内でbreakの後に書かれた処理は実行されません。
このような処理は到達不能なコードになります。
コンパイラによっては警告が出ることもあります。
基本的には、breakの後に同じ流れで実行される処理を書くべきではありません。
前回の説明に対する評価
大きな間違いはない
前回の説明は、C++初心者向けの内容としては大きな間違いはありません。
break文の基本的な使い方、ループを途中で終了すること、switch文でcaseを抜けること、二重ループでは一番内側だけ抜けること、continueとの違いなどは正しく説明されています。
特に、学習初期に押さえるべき内容としては十分です。
より正確にするなら表現を少し直すべき
ただし、より厳密にするなら、いくつか表現を調整した方がよい部分があります。
特に重要なのは、「ブロックを抜ける」という表現です。
breakは任意のブロックを抜ける文ではありません。
抜けられるのは、最も内側のループ文またはswitch文です。
そのため、次のように説明すると、より正確です。
break文は、現在の位置を囲んでいる最も内側のfor文、while文、do while文、またはswitch文をただちに終了するための文です。
この表現であれば、C++の仕様に沿った説明になります。
初心者が特に覚えるべきポイント
breakはループまたはswitchを終了する
まず覚えるべきなのは、breakはループまたはswitchを終了する文だということです。
- if文を終了するための文ではありません。
- 関数を終了するための文でもありません。
- 任意のブロックを抜けるための文でもありません。
対象は、for文、while文、do while文、switch文です。
breakは一番内側だけを抜ける
次に重要なのは、breakが抜ける範囲です。
二重ループや、ループとswitch文が組み合わさった構造では、breakがどこを抜けるのかを正しく理解する必要があります。
breakは、最も近い内側のループ文またはswitch文を抜けます。
外側のループまで自動的に終了するわけではありません。
switch文ではbreakの書き忘れに注意する
switch文では、breakを書き忘れると、次のcaseまで処理が流れることがあります。
これを意図的に使う場合もありますが、意図していない場合はバグになります。
初心者のうちは、switch文でcaseごとに処理を分ける場合、基本的にはcaseの最後で処理を止める意識を持つとよいです。
breakとcontinueを混同しない
breakとcontinueは、どちらもループの流れを変える文ですが、意味は違います。
breakは、ループそのものを終了します。
continueは、現在の繰り返しだけをスキップして、次の繰り返しに進みます。
この違いを理解しておくと、ループ処理の読み書きがかなり楽になります。
まとめ
C++のbreak文は、ループ文やswitch文を途中で終了するための基本的な制御文です。
for文、while文、do while文の中で使うと、現在のループを終了します。
switch文の中で使うと、現在のcaseの処理を終えてswitch文から抜けます。
ただし、breakは任意のブロックを抜ける文ではありません。
また、関数を終了する文でもありません。
最も重要なのは、breakが終了するのは、現在の位置を囲んでいる最も内側のループ文またはswitch文だという点です。
二重ループでは内側のループだけを抜けます。
ループの中にswitch文がある場合、switch文内のbreakは基本的にswitch文だけを抜けます。
breakは便利な文ですが、使いすぎると処理の流れが読みにくくなることもあります。
そのため、必要な場面で適切に使い、条件や終了理由が分かりやすいコードにすることが大切です。
初心者のうちは、まず次の4点を押さえておくとよいです。
breakは、ループまたはswitch文を終了する。breakは、最も内側の対象文だけを抜ける。- switch文では、
breakの書き忘れによるフォールスルーに注意する。 breakは終了、continueはスキップ、と区別する。
この4つを理解しておけば、C++のbreak文はかなり正確に使えるようになります。
以上、C++のbreak文についてでした。
最後までお読みいただき、ありがとうございました。
