C++のbreak文について

AI実装検定のご案内

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の処理は続きます。

つまり、breakcontinueの違いは次のように整理できます。

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を混同しない

breakcontinueは、どちらもループの流れを変える文ですが、意味は違います。

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文についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次