C#のbreakとcontinueの違いを初心者向けに解説!ループ制御の使い方と使い分け例
はじめに
C#でループ処理を書いていると、途中で処理を終了したい場面や、特定の条件だけ処理を飛ばしたい場面があります。そのようなときに使うのがbreakとcontinueです。
どちらもfor文、while文、foreach文などのループ制御で使われる命令ですが、動きは大きく異なります。
breakはループそのものを終了する命令です。一方、continueは現在の繰り返し処理だけをスキップし、次の繰り返しへ進む命令です。
初心者のうちは、この2つを混同しやすく、「なぜ途中で処理が終わったのか」「なぜ後ろの処理が実行されないのか」と悩むことがあります。この記事では、C#のbreakとcontinueの違い、基本的な使い方、使い分けの考え方、よくあるミスまで初心者向けにわかりやすく解説します。
1. C#のbreakとcontinueの違いとは?
C#のbreakとcontinueは、どちらもループの流れを制御するためのキーワードです。
通常、ループ処理は条件を満たしている間、上から順番に処理を実行します。しかし、実際のプログラムでは「条件に一致したらそこで終了したい」「特定のデータだけ処理しないで次に進みたい」という場面がよくあります。
そのようなときにbreakやcontinueを使うことで、ループの流れを柔軟に変えることができます。
1-1. breakはループ処理をその場で終了する命令
breakは、実行された時点でループ処理を終了します。
たとえば、1から10までの数字を順番に表示するループの中で、5になったらbreakを実行すると、そこでループは終了します。6以降の処理は実行されません。
C#for (int i = 1; i <= 10; i++)
{
if (i == 5)
{
break;
}
Console.WriteLine(i);
}
実行結果は次のようになります。
1
2
3
4
iが5になった時点でbreakが実行されるため、Console.WriteLine(i);は実行されず、ループ自体が終了します。
つまり、breakは「もうこれ以上ループを続ける必要がない」ときに使います。
1-2. continueは現在の処理をスキップして次のループへ進む命令
continueは、実行された時点で現在の繰り返し処理を中断し、次の繰り返しへ進みます。
ループ自体は終了しません。あくまで「今回の処理だけを飛ばす」という動きになります。
C#for (int i = 1; i <= 10; i++)
{
if (i == 5)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次のようになります。
1
2
3
4
6
7
8
9
10
iが5のときだけcontinueによって後続のConsole.WriteLine(i);がスキップされます。しかし、ループ自体は続くため、6以降は通常どおり表示されます。
つまり、continueは「この条件のときだけ処理しないで、次へ進みたい」ときに使います。
1-3. breakとcontinueの違いを一覧表で比較
| 項目 | break | continue |
|---|---|---|
| 役割 | ループを終了する | 今回の処理だけスキップする |
| ループは続くか | 続かない | 続く |
| 後続の処理 | 実行されない | 実行されない |
| 次の繰り返し | 進まない | 進む |
| よく使う場面 | 目的の値が見つかったとき | 条件に合わないデータを除外するとき |
| イメージ | 「ここで終わり」 | 「今回は飛ばして次へ」 |
breakとcontinueの一番大きな違いは、ループそのものを終わらせるかどうかです。
breakはループを抜けます。continueはループを抜けず、次の繰り返しに進みます。
1-4. 初心者が最初に覚えるべき使い分けの考え方
初心者は、まず次のように覚えるとわかりやすいです。
breakは「もう探す必要がない」「これ以上処理しなくてよい」ときに使います。
たとえば、配列の中から特定の値を探していて、見つかったらそれ以上探す必要がない場合はbreakが向いています。
C#int[] numbers = { 10, 20, 30, 40, 50 };
foreach (int number in numbers)
{
if (number == 30)
{
Console.WriteLine("30が見つかりました");
break;
}
}
一方、continueは「このデータだけ処理したくない」「条件に合わないものは飛ばしたい」ときに使います。
C#int[] numbers = { 10, -5, 20, -3, 30 };
foreach (int number in numbers)
{
if (number < 0)
{
continue;
}
Console.WriteLine(number);
}
この例では、負の数だけをスキップして、0以上の数だけを表示しています。
迷ったときは、次のように考えると判断しやすくなります。
「ループを終わらせたい」ならbreak。
「今回だけ飛ばして続けたい」ならcontinue。
2. C#のbreakの基本的な使い方
breakは、ループ処理やswitch文の中で使われます。
ループの中で使う場合は、そのループを終了します。switch文の中で使う場合は、現在のcaseの処理を終了してswitch文を抜けます。
ここでは、まずループ処理におけるbreakの使い方を見ていきましょう。
2-1. breakの構文
breakの構文はとてもシンプルです。
C#break;
breakは単独で使います。条件式などは直接書きません。
通常はif文と組み合わせて、特定の条件を満たしたときだけループを終了する形で使います。
C#while (true)
{
if (条件)
{
break;
}
}
このように書くことで、条件に一致したタイミングでループを抜けることができます。
2-2. for文でbreakを使う例
for文でbreakを使う例を見てみましょう。
C#for (int i = 1; i <= 10; i++)
{
if (i == 6)
{
break;
}
Console.WriteLine(i);
}
実行結果は次のとおりです。
1
2
3
4
5
iが6になった時点でbreakが実行されるため、ループはそこで終了します。
この例では、i <= 10という条件では本来10まで繰り返すはずですが、breakによって途中で終了しています。
for文の中でbreakを使うと、繰り返し回数が決まっている処理でも、途中でループを抜けることができます。
2-3. while文でbreakを使う例
while文でもbreakはよく使われます。
特に、while (true)のような無限ループを作り、特定の条件で終了する処理ではbreakが重要です。
C#int count = 1;
while (true)
{
Console.WriteLine(count);
if (count == 5)
{
break;
}
count++;
}
実行結果は次のようになります。
1
2
3
4
5
while (true)はそのままだと無限に繰り返されます。しかし、countが5になったときにbreakを実行しているため、ループを終了できます。
ユーザー入力を受け付け続けて、特定の文字が入力されたら終了するような処理でも、while文とbreakはよく使われます。
C#while (true)
{
Console.Write("終了するには q を入力してください: ");
string input = Console.ReadLine();
if (input == "q")
{
break;
}
Console.WriteLine("入力内容: " + input);
}
このコードでは、ユーザーがqを入力するまで処理を繰り返します。
2-4. foreach文でbreakを使う例
foreach文でもbreakを使うことができます。
foreach文は、配列やリストなどの要素を順番に取り出して処理するときに使います。
C#string[] fruits = { "りんご", "みかん", "バナナ", "ぶどう" };
foreach (string fruit in fruits)
{
if (fruit == "バナナ")
{
Console.WriteLine("バナナが見つかりました");
break;
}
Console.WriteLine(fruit);
}
実行結果は次のようになります。
りんご
みかん
バナナが見つかりました
バナナが見つかった時点でbreakを実行しているため、後ろにあるぶどうは処理されません。
このように、foreach文でbreakを使うと、目的の要素が見つかった時点で処理を終了できます。
2-5. switch文でbreakを使う場合との違い
C#では、breakはループだけでなくswitch文でも使われます。
C#int number = 2;
switch (number)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
default:
Console.WriteLine("その他です");
break;
}
この場合のbreakは、switch文の処理を抜けるために使われています。
ループの中で使うbreakはループを終了しますが、switch文の中で使うbreakはswitch文を終了します。
ただし、switch文がループの中にある場合は注意が必要です。
C#for (int i = 1; i <= 3; i++)
{
switch (i)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
}
Console.WriteLine("ループは続いています");
}
この例では、switch文の中のbreakはswitch文だけを抜けます。外側のfor文は終了しません。
つまり、switch文のbreakとループのbreakは、抜ける対象が異なります。
3. C#のcontinueの基本的な使い方
continueは、ループ処理の中で使います。
continueが実行されると、その時点で現在の繰り返し処理を終了し、次の繰り返しに進みます。
breakのようにループ全体を終了するわけではありません。
3-1. continueの構文
continueの構文もシンプルです。
C#continue;
通常はif文と組み合わせて使います。
C#for (int i = 0; i < 10; i++)
{
if (条件)
{
continue;
}
// 条件に一致しなかった場合だけ実行される処理
}
continueの後ろに書かれた処理は、その回では実行されません。
3-2. for文でcontinueを使う例
for文でcontinueを使う例を見てみましょう。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次のようになります。
1
2
4
5
iが3のとき、continueが実行されます。そのため、Console.WriteLine(i);は実行されず、次の繰り返しへ進みます。
for文では、continueが実行されたあと、更新式であるi++が実行され、その後に条件式が判定されます。
3-3. while文でcontinueを使う例
while文でもcontinueを使うことができます。
ただし、while文でcontinueを使う場合は、カウンター変数の更新位置に注意が必要です。
C#int i = 0;
while (i < 5)
{
i++;
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次のようになります。
1
2
4
5
この例では、i++をcontinueより前に書いています。そのため、iが3のときにcontinueしても、次のループではiが4になって処理が続きます。
もしi++をcontinueの後ろに書いてしまうと、条件によってはカウンターが更新されず、無限ループになる可能性があります。
3-4. foreach文でcontinueを使う例
foreach文でもcontinueは使えます。
C#string[] names = { "田中", "", "佐藤", "", "鈴木" };
foreach (string name in names)
{
if (name == "")
{
continue;
}
Console.WriteLine(name);
}
実行結果は次のようになります。
田中
佐藤
鈴木
空文字の要素だけをcontinueでスキップし、それ以外の名前だけを表示しています。
foreach文では、自分でカウンターを更新する必要がないため、while文よりもcontinueを安全に使いやすいです。
3-5. continue実行後に処理がどこへ戻るのか
continueが実行されたあとは、ループの種類によって戻る位置が少し異なります。
for文の場合は、まず更新式に進みます。
C#for (int i = 0; i < 5; i++)
{
if (i == 2)
{
continue;
}
Console.WriteLine(i);
}
continue後はi++が実行され、その後に条件式i < 5が判定されます。
while文の場合は、条件式の判定に戻ります。
C#while (条件)
{
if (スキップ条件)
{
continue;
}
// 通常処理
}
foreach文の場合は、次の要素の取得に進みます。
C#foreach (var item in collection)
{
if (スキップ条件)
{
continue;
}
// 通常処理
}
つまり、continueは「ループの先頭に完全に戻る」というよりも、「次の繰り返しの準備へ進む」と考えると理解しやすいです。
4. breakとcontinueの動きの違いをサンプルコードで比較
breakとcontinueの違いは、同じループ処理で比較するとよくわかります。
ここでは、1から5までの数字を扱う同じようなコードで、breakを使った場合とcontinueを使った場合の動きを比べてみましょう。
4-1. 同じループ処理でbreakを使った場合
まずはbreakを使った例です。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
break;
}
Console.WriteLine("i = " + i);
}
実行結果は次のようになります。
i = 1
i = 2
iが3になった時点でbreakが実行されます。そのため、ループはそこで終了し、4や5は処理されません。
この動きから、breakは「条件に一致したらループ全体を終わらせる」命令だとわかります。
4-2. 同じループ処理でcontinueを使った場合
次に、同じ条件でcontinueを使ってみます。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine("i = " + i);
}
実行結果は次のようになります。
i = 1
i = 2
i = 4
i = 5
iが3のときだけ、Console.WriteLine("i = " + i);がスキップされます。しかし、ループは終了しないため、4と5は処理されます。
この動きから、continueは「条件に一致した回だけ処理を飛ばす」命令だとわかります。
4-3. 実行結果から見る処理の流れの違い
同じ条件i == 3でも、breakとcontinueでは実行結果が異なります。
breakの場合は、3になった時点でループが終了します。
i = 1
i = 2
continueの場合は、3だけをスキップしてループが続きます。
i = 1
i = 2
i = 4
i = 5
つまり、処理の流れは次のようになります。
breakの場合は、1、2を処理し、3で終了します。continueの場合は、1、2を処理し、3を飛ばし、4、5を処理します。
初心者が混乱しやすいポイントは、どちらも「後ろの処理を実行しない」という点です。
breakもcontinueも、その後ろに書かれた処理は実行されません。しかし、breakはループ全体を終了し、continueは次の繰り返しへ進むという違いがあります。
4-4. 図解で理解するbreakとcontinueの処理フロー
breakの処理フローは次のようなイメージです。
ループ開始
↓
条件判定
↓
break条件に一致?
├─ はい → ループ終了
└─ いいえ → 通常処理
↓
次の繰り返し
breakは、条件に一致した時点でループの外へ出ます。
一方、continueの処理フローは次のようになります。
ループ開始
↓
条件判定
↓
continue条件に一致?
├─ はい → 今回の残り処理をスキップして次の繰り返しへ
└─ いいえ → 通常処理
↓
次の繰り返し
continueは、ループの外へ出るのではなく、次の繰り返しへ進みます。
この違いを図で考えると、breakは「出口へ向かう」、continueは「次の周回へ向かう」とイメージできます。
5. breakとcontinueの使い分け方
breakとcontinueを正しく使い分けるには、ループを「終わらせたい」のか、「続けたい」のかを考えることが大切です。
5-1. 条件に一致したらループを終了したいときはbreak
条件に一致した時点で、それ以上ループを続ける必要がない場合はbreakを使います。
たとえば、商品の一覧から目的の商品を探す処理を考えてみましょう。
C#string[] products = { "本", "ペン", "ノート", "消しゴム" };
foreach (string product in products)
{
if (product == "ノート")
{
Console.WriteLine("ノートが見つかりました");
break;
}
}
目的のノートが見つかったら、それ以降の要素を確認する必要はありません。このような場合はbreakが適しています。
breakを使うことで、不要な処理を減らすことができ、コードの意図もわかりやすくなります。
5-2. 特定の条件だけ処理を飛ばしたいときはcontinue
条件に一致したデータだけを処理対象から外し、それ以外のデータは処理したい場合はcontinueを使います。
C#int[] scores = { 80, -1, 90, 70, -1, 100 };
foreach (int score in scores)
{
if (score == -1)
{
continue;
}
Console.WriteLine("点数: " + score);
}
この例では、-1を無効な点数としてスキップしています。無効なデータだけを飛ばし、ほかの点数は処理を続けます。
このように、データの一部を除外したいときにはcontinueが便利です。
5-3. 検索処理でbreakを使うケース
検索処理では、breakがよく使われます。
たとえば、IDの一覧から特定のIDを探す処理です。
C#int[] ids = { 101, 102, 103, 104, 105 };
int targetId = 103;
bool found = false;
foreach (int id in ids)
{
if (id == targetId)
{
found = true;
break;
}
}
if (found)
{
Console.WriteLine("IDが見つかりました");
}
else
{
Console.WriteLine("IDが見つかりませんでした");
}
目的のIDが見つかったら、それ以上探す必要はありません。そのため、breakでループを終了します。
このように、検索対象が見つかった時点で処理を終えたい場合はbreakが適しています。
5-4. 入力チェックや除外処理でcontinueを使うケース
入力チェックやデータの除外処理では、continueが役立ちます。
たとえば、空の文字列を除外して処理する例です。
C#string[] inputs = { "apple", "", "banana", "", "orange" };
foreach (string input in inputs)
{
if (string.IsNullOrEmpty(input))
{
continue;
}
Console.WriteLine(input);
}
空文字のデータは処理せず、値が入っているデータだけを表示しています。
また、条件に合わないデータを早めにスキップすることで、ネストを浅くできる場合もあります。
C#foreach (int score in scores)
{
if (score < 0)
{
continue;
}
if (score >= 80)
{
Console.WriteLine("合格です");
}
}
このように、先に不要なデータを除外しておくと、後続の処理が読みやすくなります。
5-5. breakとcontinueを使わないほうがよいケース
breakとcontinueは便利ですが、多用しすぎるとコードの流れが追いにくくなります。
特に、1つのループの中にbreakやcontinueが何度も登場すると、「どの条件で処理が終わるのか」「どの条件でスキップされるのか」がわかりにくくなります。
C#foreach (int value in values)
{
if (value < 0)
{
continue;
}
if (value == 0)
{
continue;
}
if (value > 100)
{
break;
}
Console.WriteLine(value);
}
このようなコードは、条件が増えるほど読みにくくなります。
場合によっては、条件式を整理したり、処理をメソッドに分けたりしたほうがよいです。
C#foreach (int value in values)
{
if (!IsValid(value))
{
continue;
}
Console.WriteLine(value);
}
bool IsValid(int value)
{
return value > 0 && value <= 100;
}
breakやcontinueを使うこと自体は問題ありませんが、読みやすさを意識して使うことが大切です。
6. ネストしたループでbreakとcontinueを使うときの注意点
ループの中にさらにループがある構造を、ネストしたループといいます。
ネストしたループでbreakやcontinueを使うときは、「どのループに対して効くのか」を理解しておく必要があります。
6-1. breakは内側のループだけを抜ける
ネストしたループの内側でbreakを使うと、終了するのは内側のループだけです。外側のループは続きます。
C#for (int i = 1; i <= 3; i++)
{
Console.WriteLine("外側 i = " + i);
for (int j = 1; j <= 3; j++)
{
if (j == 2)
{
break;
}
Console.WriteLine(" 内側 j = " + j);
}
}
実行結果は次のようになります。
外側 i = 1
内側 j = 1
外側 i = 2
内側 j = 1
外側 i = 3
内側 j = 1
内側のループでj == 2になったときにbreakしていますが、外側のiのループは続いています。
つまり、breakは一番近いループだけを抜けます。
6-2. continueは内側のループの次の繰り返しへ進む
ネストしたループの内側でcontinueを使うと、内側のループの次の繰り返しへ進みます。
C#for (int i = 1; i <= 2; i++)
{
Console.WriteLine("外側 i = " + i);
for (int j = 1; j <= 3; j++)
{
if (j == 2)
{
continue;
}
Console.WriteLine(" 内側 j = " + j);
}
}
実行結果は次のようになります。
外側 i = 1
内側 j = 1
内側 j = 3
外側 i = 2
内側 j = 1
内側 j = 3
j == 2のときだけ、内側のループの表示処理がスキップされています。外側のループには直接影響しません。
continueもbreakと同じく、一番近いループに対して作用すると考えるとわかりやすいです。
6-3. 外側のループまで抜けたい場合の考え方
C#のbreakは、基本的に一番近いループだけを抜けます。そのため、内側のループから外側のループまで一気に抜けたい場合は、工夫が必要です。
代表的な方法は、フラグ変数を使う方法です。
C#bool found = false;
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 3; j++)
{
if (i == 2 && j == 2)
{
found = true;
break;
}
Console.WriteLine($"i = {i}, j = {j}");
}
if (found)
{
break;
}
}
内側のループで条件に一致したらfoundをtrueにして、まず内側のループをbreakします。その後、外側のループでもfoundを確認してbreakします。
また、処理をメソッドに分けてreturnで抜ける方法もあります。
C#void Search()
{
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 3; j++)
{
if (i == 2 && j == 2)
{
return;
}
Console.WriteLine($"i = {i}, j = {j}");
}
}
}
returnはメソッド全体を終了するため、ネストしたループから抜けたい場合に使いやすいことがあります。
6-4. ネストが深い処理を読みやすくするコツ
ネストが深い処理の中でbreakやcontinueを使うと、コードの流れが複雑になりやすいです。
読みやすくするためには、次のような工夫が有効です。
まず、条件をわかりやすい名前のメソッドに分けます。
C#foreach (var item in items)
{
if (ShouldSkip(item))
{
continue;
}
Process(item);
}
次に、ネストを浅くすることを意識します。
C#foreach (var user in users)
{
if (!user.IsActive)
{
continue;
}
Console.WriteLine(user.Name);
}
このように、先に除外条件をcontinueで処理すると、メインの処理を深いif文の中に書かずに済みます。
ただし、continueが多すぎると逆に読みづらくなるため、条件が多い場合はメソッド化や設計の見直しも検討しましょう。
7. breakとcontinueでよくある初心者のミス
breakとcontinueは構文自体は簡単ですが、使い方を間違えると予想外の動きになります。
ここでは、初心者がよく間違えやすいポイントを紹介します。
7-1. breakとcontinueを逆に使ってしまう
よくあるミスの1つが、breakとcontinueを逆に使ってしまうことです。
たとえば、特定の値だけスキップしたいのにbreakを使ってしまうケースです。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
break;
}
Console.WriteLine(i);
}
このコードでは、3だけを飛ばしたいつもりでも、breakによってループが終了してしまいます。
3だけをスキップしたい場合は、continueを使います。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
breakは終了、continueはスキップと覚えておきましょう。
7-2. continueの後ろに書いた処理が実行されない
continueを使うと、その後ろに書かれた処理は実行されません。
C#for (int i = 1; i <= 3; i++)
{
if (i == 2)
{
continue;
}
Console.WriteLine("処理中: " + i);
}
iが2のとき、continueの後ろにあるConsole.WriteLineは実行されません。
実行結果は次のようになります。
処理中: 1
処理中: 3
「なぜ2が表示されないのか」と思った場合は、continueの位置を確認しましょう。
continueより後ろにある処理は、その回では実行されません。
7-3. while文でcontinueを使って無限ループになる
while文でcontinueを使うときは、カウンターの更新位置に注意が必要です。
次のコードは無限ループになる可能性があります。
C#int i = 0;
while (i < 5)
{
if (i == 2)
{
continue;
}
Console.WriteLine(i);
i++;
}
iが2になったとき、continueが実行されます。すると、後ろにあるi++が実行されないため、iはずっと2のままになります。
その結果、i < 5がずっとtrueになり、無限ループになります。
正しくは、i++をcontinueより前に移動します。
C#int i = 0;
while (i < 5)
{
i++;
if (i == 2)
{
continue;
}
Console.WriteLine(i);
}
while文でcontinueを使うときは、ループを進めるための処理がスキップされないか確認しましょう。
7-4. switch文のbreakとループのbreakを混同する
switch文の中でもbreakを使うため、初心者はループのbreakと混同しやすいです。
C#for (int i = 1; i <= 3; i++)
{
switch (i)
{
case 1:
Console.WriteLine("1です");
break;
case 2:
Console.WriteLine("2です");
break;
}
Console.WriteLine("ループ継続");
}
このコードのbreakは、switch文を抜けるためのものです。外側のfor文は終了しません。
ループを終了したい場合は、switch文の外側で条件を判定するなどの工夫が必要です。
C#for (int i = 1; i <= 3; i++)
{
if (i == 2)
{
break;
}
switch (i)
{
case 1:
Console.WriteLine("1です");
break;
}
}
breakがどの構文を抜けるのかを意識することが大切です。
7-5. 条件式が複雑になりコードが読みにくくなる
breakやcontinueを使う条件式が複雑になると、コードが読みにくくなります。
C#foreach (var user in users)
{
if ((user.Age < 20 && !user.HasPermission) || user.IsDeleted || user.Name == "")
{
continue;
}
Console.WriteLine(user.Name);
}
このような条件式は、何を判定しているのかがわかりにくくなります。
条件に意味のある名前を付けると、読みやすくなります。
C#foreach (var user in users)
{
if (ShouldSkipUser(user))
{
continue;
}
Console.WriteLine(user.Name);
}
C#bool ShouldSkipUser(User user)
{
return (user.Age < 20 && !user.HasPermission)
|| user.IsDeleted
|| user.Name == "";
}
breakやcontinueを使うときは、条件式が読みやすいかどうかも意識しましょう。
8. breakとcontinueを使った実践的なC#コード例
ここからは、実際のプログラムで使いやすいbreakとcontinueのコード例を紹介します。
8-1. 配列から特定の値を見つけたらbreakする例
配列から特定の値を探し、見つかったら処理を終了する例です。
C#int[] numbers = { 5, 12, 18, 25, 30 };
int target = 18;
bool found = false;
foreach (int number in numbers)
{
if (number == target)
{
found = true;
break;
}
}
if (found)
{
Console.WriteLine($"{target}が見つかりました");
}
else
{
Console.WriteLine($"{target}は見つかりませんでした");
}
このコードでは、18が見つかった時点でbreakします。
目的の値が見つかったあとに残りの要素を調べる必要はないため、breakを使うのが自然です。
8-2. 偶数だけをスキップしてcontinueする例
次は、偶数だけをスキップして奇数だけを表示する例です。
C#for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次のようになります。
1
3
5
7
9
i % 2 == 0は、iが偶数かどうかを判定しています。偶数の場合はcontinueでスキップされるため、奇数だけが表示されます。
8-3. 不正なデータを除外して処理を続ける例
実際の開発では、不正なデータや空のデータを除外しながら処理することがあります。
C#string[] emails = {
"tanaka@example.com",
"",
"sato@example.com",
"invalid-email",
"suzuki@example.com"
};
foreach (string email in emails)
{
if (string.IsNullOrEmpty(email))
{
continue;
}
if (!email.Contains("@"))
{
continue;
}
Console.WriteLine("送信対象: " + email);
}
実行結果は次のようになります。
送信対象: tanaka@example.com
送信対象: sato@example.com
送信対象: suzuki@example.com
空文字や@を含まない文字列をcontinueでスキップしています。
不正なデータを早めに除外することで、正常なデータに対する処理だけを下に書くことができます。
8-4. ユーザー入力を条件にループを終了する例
ユーザーが特定の文字を入力するまで処理を続ける例です。
C#while (true)
{
Console.Write("文字を入力してください。終了するには exit と入力: ");
string input = Console.ReadLine();
if (input == "exit")
{
break;
}
Console.WriteLine("入力された文字: " + input);
}
このコードでは、ユーザーがexitと入力するとbreakが実行され、ループが終了します。
メニュー画面、チャット入力、コマンド入力など、ユーザーが終了を選ぶまで繰り返す処理でよく使われる形です。
8-5. breakとcontinueを組み合わせた例
breakとcontinueは、同じループの中で組み合わせて使うこともできます。
次の例では、負の数はスキップし、0が出たら処理を終了します。
C#int[] numbers = { 10, -3, 20, -5, 30, 0, 40 };
foreach (int number in numbers)
{
if (number < 0)
{
continue;
}
if (number == 0)
{
break;
}
Console.WriteLine(number);
}
実行結果は次のようになります。
10
20
30
負の数はcontinueでスキップされます。
0が出た時点でbreakによってループが終了します。
そのため、0より後ろにある40は処理されません。
このように、continueで不要なデータを飛ばし、breakで終了条件を表すことができます。
ただし、組み合わせて使う場合は、処理の流れが複雑にならないように注意しましょう。
9. breakとcontinueに関するよくある質問
ここでは、C#のbreakとcontinueについて初心者が疑問に感じやすいポイントを解説します。
9-1. breakとreturnの違いは?
breakは、ループやswitch文を抜けるための命令です。
一方、returnはメソッドの処理を終了して、呼び出し元に戻る命令です。
C#void TestBreak()
{
for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
break;
}
Console.WriteLine(i);
}
Console.WriteLine("メソッド内の後続処理");
}
この例では、breakでループは終了しますが、メソッド内の後続処理は実行されます。
C#void TestReturn()
{
for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
return;
}
Console.WriteLine(i);
}
Console.WriteLine("メソッド内の後続処理");
}
この例では、returnが実行された時点でメソッド自体が終了するため、後続処理は実行されません。
つまり、breakはループやswitchを抜ける命令、returnはメソッドを終了する命令です。
9-2. continueとreturnの違いは?
continueは、現在の繰り返し処理だけをスキップして、次の繰り返しへ進む命令です。
一方、returnはメソッド全体を終了します。
C#void TestContinue()
{
for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
Console.WriteLine("メソッド終了前の処理");
}
この場合、3だけがスキップされ、ループは続きます。さらに、ループ後の処理も実行されます。
C#void TestReturn()
{
for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
return;
}
Console.WriteLine(i);
}
Console.WriteLine("この処理は実行されません");
}
この場合、iが3になった時点でメソッドが終了します。
continueはループを続ける命令、returnはメソッドを終わらせる命令と覚えましょう。
9-3. foreach文の中でbreakやcontinueは使える?
はい、foreach文の中でもbreakとcontinueは使えます。
C#string[] items = { "A", "B", "C", "D" };
foreach (string item in items)
{
if (item == "C")
{
break;
}
Console.WriteLine(item);
}
この例では、Cになった時点でbreakし、ループを終了します。
C#string[] items = { "A", "B", "C", "D" };
foreach (string item in items)
{
if (item == "C")
{
continue;
}
Console.WriteLine(item);
}
この例では、Cだけをスキップし、ほかの要素は表示されます。
foreach文でも、breakはループ終了、continueは現在の要素だけスキップという動きになります。
9-4. switch文の中でcontinueは使える?
continueはループの中で使う命令です。そのため、ループの外にあるswitch文の中では使えません。
C#int number = 1;
switch (number)
{
case 1:
// continue; // ループの中ではないため使えない
break;
}
ただし、switch文がループの中にある場合は、continueを使うことができます。
C#for (int i = 1; i <= 3; i++)
{
switch (i)
{
case 2:
continue;
}
Console.WriteLine(i);
}
この場合、iが2のときにcontinueが実行され、外側のfor文の次の繰り返しへ進みます。
実行結果は次のようになります。
1
3
switch文の中でcontinueを使う場合は、近くにループがあるかどうかを確認しましょう。
9-5. breakやcontinueを多用しても問題ない?
breakやcontinueを使うこと自体は問題ありません。むしろ、適切に使うとコードが読みやすくなることがあります。
たとえば、不正なデータを先にcontinueで除外すると、メインの処理を深いif文の中に書かずに済みます。
C#foreach (var item in items)
{
if (item == null)
{
continue;
}
Process(item);
}
ただし、多用しすぎると処理の流れが追いにくくなることがあります。
特に、1つのループ内にbreakやcontinueが何度も出てくる場合は注意が必要です。
読みやすさを保つためには、次の点を意識しましょう。
| ポイント | 内容 |
|---|---|
| 条件をシンプルにする | 複雑な条件式はメソッド化する |
| 使う目的を明確にする | 終了ならbreak、スキップならcontinue |
| ループを短くする | 長いループでは流れが追いにくくなる |
| ネストを深くしすぎない | 必要に応じて処理を分割する |
breakやcontinueは、使いどころを意識すれば便利な命令です。重要なのは、コードを読む人が処理の流れを理解しやすいかどうかです。
まとめ
C#のbreakとcontinueは、ループ処理の流れを制御するために使う重要なキーワードです。
breakは、ループ処理をその場で終了します。条件に一致したら、それ以上繰り返す必要がない場合に使います。たとえば、配列やリストから目的の値を見つけたとき、ユーザーが終了コマンドを入力したときなどに便利です。
一方、continueは、現在の繰り返し処理だけをスキップして、次の繰り返しへ進みます。特定の条件に一致するデータだけを除外したい場合や、不正な入力を飛ばして処理を続けたい場合に使います。
初心者は、まず次のように覚えるとわかりやすいです。
| キーワード | 覚え方 |
|---|---|
| break | ループを終わらせる |
| continue | 今回だけ飛ばして次へ進む |
また、breakやcontinueの後ろに書かれた処理は、その回では実行されません。特にwhile文でcontinueを使う場合は、カウンターの更新処理がスキップされて無限ループにならないよう注意が必要です。
ネストしたループでは、breakやcontinueは基本的に一番近いループに対して作用します。外側のループまで抜けたい場合は、フラグ変数を使ったり、処理をメソッドに分けてreturnを使ったりすると読みやすくなります。
breakとcontinueは、正しく使えばC#のループ処理をわかりやすく、効率よく書くための便利な命令です。ループを終了したいのか、特定の処理だけをスキップしたいのかを意識して、適切に使い分けましょう。

