C++のネストされたループを徹底解説!breakとcontinueの応用とコツ
生徒
「先生、繰り返し処理の中にさらに繰り返しを入れることってできるんですか?九九の表みたいなものを作りたいんです!」
先生
「できますよ。それを『ネストされたループ(多重ループ)』と呼びます。表形式のデータや、複雑な図形を描くときにとても役立ちます。」
生徒
「でも、途中で特定の条件の時だけ処理を飛ばしたり、全部のループを一気に終わらせたりするのは難しそうです……。」
先生
「そこで『break』や『continue』の出番です!これらを組み合わせることで、二重、三重のループも自由自在にコントロールできるようになりますよ。」
1. ネストされたループとは?基本の仕組み
C++のプログラミングにおけるネスト(Nest)とは、ある構造の中に同じ構造が入っている状態、つまり「入れ子」のことを指します。ループのネストとは、for文やwhile文といった繰り返し処理の中に、さらに別のループが入っている状態です。これによって、多次元的な処理が可能になります。
最も分かりやすい例が「時計」です。「分」が60回繰り返される(1周する)たびに、「時」が1つ進みますよね。このように「内側の繰り返しが全部終わると、外側の繰り返しが1つ進む」という連動した動きを作ることができます。プログラミング未経験の方でも、この「外の枠組み」と「内の動き」という二段階の構造をイメージすれば、理解がぐっと深まります。SEOの観点からも、C++の基礎として多重ループは避けて通れない重要なトピックです。
2. 二重ループで「九九の表」を作ってみよう
具体的に、ネストされたループを使って「九九の表」を表示するプログラムを考えてみましょう。外側のループが「段(1の段、2の段……)」を担当し、内側のループが「かける数(×1、×2……)」を担当します。このように二つのループを組み合わせることで、合計で81回(9×9)の計算をわずか数行のコードで実現できるのです。
#include <iostream>
int main() {
// 外側のループ:1段から3段まで
for (int i = 1; i <= 3; i++) {
// 内側のループ:各段で1から3までかける
for (int j = 1; j <= 3; j++) {
std::cout << i << "x" << j << "=" << i * j << " ";
}
// 1つの段が終わるごとに改行する
std::cout << std::endl;
}
return 0;
}
実行結果は以下のようになります。
1x1=1 1x2=2 1x3=3
2x1=2 2x2=4 2x3=6
3x1=3 3x2=6 3x3=9
このプログラムでは、外側のループの変数iが1のとき、内側のループの変数jが1、2、3と変化します。それが終わるとiが2になり、またjが1から3まで繰り返されます。パソコンを触ったことがない方でも、この「親ループ」と「子ループ」の親子関係を掴むのがポイントです。
3. ネスト内のbreak文!どこまで脱出するのか?
ここで重要な応用技術であるbreak文(ブレイク)について解説します。break文は「ループを途中で終わらせる」命令ですが、ネストされている場合に使うと「今自分がいる一番内側のループだけ」を抜けるという性質があります。外側のループまで一気に終わらせるわけではない点に注意しましょう。
例えば、先ほどの九九の例で、「かける数(j)が2になったらその段の計算を切り上げる」という処理をbreakを使って書いてみます。この場合、その段の計算は終わりますが、次の段の計算は通常通り始まります。これを理解することで、細かな制御が可能になります。
#include <iostream>
int main() {
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (j == 2) {
std::cout << "(中断) ";
break; // 内側のループだけを脱出
}
std::cout << i << "x" << j << "=" << i * j << " ";
}
std::cout << "--- " << i << "段目終了" << std::endl;
}
return 0;
}
1x1=1 (中断) --- 1段目終了
2x1=2 (中断) --- 2段目終了
3x1=3 (中断) --- 3段目終了
4. ネスト内のcontinue文で特定の処理をスキップ
次にcontinue文(コンティニュー)です。これは「今回の回だけスキップして、次の回に進む」という命令です。ネスト構造で使うと、やはり「今自分がいるループの、今回のステップだけ」を飛ばします。外側のループには影響を与えません。
例えば、「2の段だけは計算を表示したくない」といった場合や、「かける数が2の時だけ表示を飛ばしたい」といった場合に役立ちます。条件分岐のif文と組み合わせることで、「特定のパターンだけ除外する」という複雑な動きが作れます。初心者のうちは、breakとの違い(完全にやめるか、今回だけ飛ばすか)をしっかり区別しましょう。
#include <iostream>
int main() {
for (int i = 1; i <= 3; i++) {
std::cout << i << "の段: ";
for (int j = 1; j <= 3; j++) {
if (j == 2) {
continue; // jが2の時だけ、これ以降の表示処理を飛ばす
}
std::cout << i << "x" << j << "=" << i * j << " ";
}
std::cout << std::endl;
}
return 0;
}
1の段: 1x1=1 1x3=3
2の段: 2x1=2 2x3=6
3の段: 3x1=3 3x3=9
5. 実用的な応用:二次元データの検索
なぜネストされたループが必要なのでしょうか?それは、現実世界の多くのデータが「縦と横」を持っているからです。例えば、座席表の中から「特定の名前」を探したり、写真のピクセル(点)を一つずつ加工したりする際には、必ずネストされたループを使います。
以下のコードは、3×3のマス目の中に隠された「宝物(数字の7)」を探すイメージのプログラムです。宝物が見つかった瞬間に、それ以上の調査を止めるようにbreakを配置します。ただし、前述の通りbreak一つでは内側しか抜けられないため、外側も抜けるための工夫(フラグ)についても触れておきます。これはC++の中級者への第一歩となるテクニックです。
#include <iostream>
int main() {
int map[3][3] = {
{1, 2, 3},
{4, 7, 6}, // ここに7がある
{8, 9, 0}
};
bool found = false;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (map[i][j] == 7) {
std::cout << i << "行" << j << "列で宝を発見!" << std::endl;
found = true;
break; // 内側のループを抜ける
}
}
if (found) break; // 宝が見つかっていたら外側のループも抜ける
}
return 0;
}
1行1列で宝を発見!
6. ネストが深くなりすぎないための注意点(可読性)
ネストされたループは非常に便利ですが、三重、四重と深くしすぎるのは危険です。これを「深いネスト」と呼び、プログラムが非常に読みづらくなってしまいます。パソコンの画面を右に右にと追いかけなければならず、どこで何が終わっているのか分からなくなります。これを防ぐために、「可読性(かどくせい)」を意識することがプログラマーには求められます。
一般的には二重ループまでは許容されますが、三重以上になる場合は、中身を別の「関数(命令のセット)」に切り出したり、処理を見直したりすることを検討しましょう。綺麗なコードはバグを減らし、将来の自分や仲間の助けになります。SEOキーワードとしても「C++ 可読性 ネスト」はプロがよく意識するポイントです。
7. 無限ループとネストの組み合わせ
時には、意図的に「ずっと繰り返す」設定のwhile(true)という無限ループの中に、別のループを入れることもあります。例えば、ゲームのメイン画面(ずっと動いている)の中に、敵キャラクターが画面を左右に往復する動き(繰り返しの動き)を入れるようなケースです。この場合、breakがどのループを終わらせるものなのかを正確に把握していないと、ゲームが終了しなくなったり、予期せぬ動きをしたりします。
プログラミング未経験の方は、まず「小さな単位」で動作を確認することを強くおすすめします。一気に大きなネストを作るのではなく、まずは一つのループ、次にその中にif文、次にその中にさらにループ……と、一段ずつ階段を登るようにコードを育てていくのが、遠回りに見えて一番の近道です。
8. まとめ:ループ制御をマスターする重要性
ネストされたループと、それを操るbreakやcontinueは、C++の制御構文の中でも「プログラムに命を吹き込む」非常に強力な武器です。これらを使いこなせるようになると、数学的な計算だけでなく、画像処理やゲーム開発、データ分析など、活躍の場が一気に広がります。Googleの検索エンジンでも「C++ 二重ループ 使い方」といったキーワードは非常に人気があります。
難しいと感じたら、まずは紙に図を描いて、変数iやjがどのように変わっていくかを追いかけてみてください。自分の手で動きをシミュレーションすることが、パソコンを使わずにプログラミング能力を高める最高の方法です。基礎をしっかり固めて、より複雑なプログラムの世界へ踏み出していきましょう!