C#のfor文でcontinueを使う方法|処理をスキップして次のループへ進む基本とサンプルコード
はじめに
C#で繰り返し処理を書くときによく使うのがfor文です。for文を使うと、指定した回数だけ同じ処理を繰り返すことができます。
その中で、特定の条件に当てはまるときだけ処理を飛ばしたい場合に使えるのがcontinueです。
たとえば、1から10までの数値を順番に処理する中で「5だけ処理したくない」「偶数だけスキップしたい」「空文字のデータは無視したい」といった場面があります。このようなときにcontinueを使うと、現在のループ処理を途中でスキップして、次のループへ進めることができます。
この記事では、C#のfor文でcontinueを使う方法について、基本構文からサンプルコード、breakとの違い、注意点まで初心者にも分かりやすく解説します。
1. C#のfor文でcontinueを使うと何ができるのか
C#のfor文でcontinueを使うと、繰り返し処理の途中で「この回の処理はここで終了して、次の繰り返しに進む」という動きを実現できます。
すべてのデータを同じように処理するのではなく、条件に合わないデータだけを除外したいときに便利です。
1-1. continueは現在の処理をスキップして次のループへ進む命令
continueは、ループの中で使う制御文のひとつです。
continueが実行されると、その時点で現在のループ内の残りの処理は実行されません。そして、次の繰り返し処理へ進みます。
たとえば、次のようなイメージです。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
このコードでは、iが3のときにcontinueが実行されます。そのため、Console.WriteLine(i);は実行されず、3は表示されません。
実行結果は次のようになります。
1
2
4
5
3だけがスキップされ、ループ自体は最後まで続いていることが分かります。
1-2. for文の中でcontinueが実行される流れ
for文の中でcontinueが実行されると、処理の流れは次のようになります。
C#for (int i = 0; i < 5; i++)
{
if (条件)
{
continue;
}
// continueが実行された場合、この部分はスキップされる
}
continueが実行された場合、continueより下に書かれている処理は実行されません。
ただし、for文の場合はそのまま完全に最初へ戻るのではなく、まず更新式に進みます。たとえばi++が実行され、その後に条件式が再び判定されます。
つまり、for文におけるcontinueの流れは次のようになります。
ループ内の処理を実行する
continueが実行されるそれ以降の処理をスキップする
更新式に進む
条件式を判定する
条件がtrueなら次のループを実行する
このように、continueは「ループを終了する」のではなく、「現在の1回分の処理だけをスキップする」命令です。
1-3. breakとの違いは「終了」ではなく「次へ進む」こと
continueと似た制御文にbreakがあります。
どちらもループ内で使われることが多いですが、動きは大きく異なります。
continueは、現在の処理だけをスキップして次のループへ進みます。一方、breakはループそのものを終了します。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
この場合、3だけをスキップして、4と5の処理は続きます。
1
2
4
5
一方、breakを使うと次のようになります。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
break;
}
Console.WriteLine(i);
}
実行結果は次の通りです。
1
2
iが3になった時点でループが終了するため、4や5は処理されません。
このように、continueは「次へ進む」、breakは「終わる」と覚えると分かりやすいです。
1-4. continueを使う場面の具体例
continueは、条件に合わないデータを処理対象から外したいときに使います。
具体的には、次のような場面で役立ちます。
C#for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
{
continue;
}
Console.WriteLine(i);
}
このコードでは、偶数のときにcontinueを実行しています。そのため、偶数はスキップされ、奇数だけが表示されます。
1
3
5
7
9
ほかにも、配列の中から空文字を除外したり、特定の値を無視したり、エラーになりそうなデータだけを飛ばしたりする場面で使えます。
2. C#のfor文でcontinueを使う基本構文
ここでは、C#のfor文でcontinueを使う基本的な書き方を確認します。
continueは単独で使うこともできますが、実際にはif文と組み合わせて「特定の条件のときだけスキップする」という使い方が一般的です。
2-1. for文の基本構造
まず、C#のfor文の基本構造を確認しましょう。
C#for (初期化式; 条件式; 更新式)
{
// 繰り返し実行する処理
}
たとえば、0から4まで表示するコードは次のようになります。
C#for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
実行結果は次の通りです。
0
1
2
3
4
for文では、最初にint i = 0で変数を初期化し、i < 5がtrueの間だけ処理を繰り返します。1回の処理が終わるたびにi++で値が1ずつ増えます。
2-2. continueを書く位置と実行タイミング
continueは、for文のブロック内に書きます。
C#for (int i = 0; i < 5; i++)
{
continue;
Console.WriteLine(i);
}
ただし、このように無条件でcontinueを書くと、continueより下の処理は毎回実行されません。
そのため、通常は次のようにif文と組み合わせます。
C#for (int i = 0; i < 5; i++)
{
if (i == 2)
{
continue;
}
Console.WriteLine(i);
}
このコードでは、iが2のときだけcontinueが実行されます。iが0、1、3、4のときは、通常通りConsole.WriteLine(i);が実行されます。
2-3. if文と組み合わせて条件付きでスキップする書き方
continueは、条件に一致したときだけ処理を飛ばすために使うことが多いです。
基本形は次の通りです。
C#for (int i = 0; i < 10; i++)
{
if (スキップしたい条件)
{
continue;
}
// スキップされなかった場合に実行する処理
}
たとえば、3の倍数をスキップする場合は次のように書けます。
C#for (int i = 1; i <= 10; i++)
{
if (i % 3 == 0)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次のようになります。
1
2
4
5
7
8
10
3、6、9は3の倍数なのでスキップされています。
2-4. 最小サンプルコードで動きを確認する
まずは、最もシンプルなサンプルでcontinueの動きを確認してみましょう。
C#using System;
class Program
{
static void Main()
{
for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
}
}
実行結果は次の通りです。
1
2
4
5
iが3のとき、continueによってConsole.WriteLine(i);がスキップされます。
ポイントは、3でループが終わっていないことです。continueはループを終了する命令ではないため、4と5の処理は続けて実行されます。
3. C#のfor文でcontinueを使うサンプルコード
ここからは、C#のfor文でcontinueを使う具体的なサンプルコードを紹介します。
数値のスキップ、偶数や奇数の処理、配列の条件判定、空文字やnullの除外など、実際のプログラムでも使いやすい例を見ていきましょう。
3-1. 特定の数値だけスキップするサンプル
まずは、特定の数値だけをスキップする例です。
C#using System;
class Program
{
static void Main()
{
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が実行されます。そのため、5だけが表示されません。
「この値だけは処理対象外にしたい」という場合に使いやすい書き方です。
複数の値をスキップしたい場合は、条件式を追加できます。
C#for (int i = 1; i <= 10; i++)
{
if (i == 3 || i == 7)
{
continue;
}
Console.WriteLine(i);
}
この場合、3と7がスキップされます。
3-2. 偶数または奇数だけ処理するサンプル
次に、偶数または奇数だけを処理するサンプルです。
偶数をスキップして奇数だけ表示する場合は、次のように書きます。
C#using System;
class Program
{
static void Main()
{
for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
{
continue;
}
Console.WriteLine(i);
}
}
}
実行結果は次の通りです。
1
3
5
7
9
i % 2 == 0は、iを2で割った余りが0、つまり偶数であることを意味します。偶数の場合はcontinueで処理をスキップするため、奇数だけが表示されます。
反対に、奇数をスキップして偶数だけ表示する場合は、条件を次のように変更します。
C#for (int i = 1; i <= 10; i++)
{
if (i % 2 != 0)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次の通りです。
2
4
6
8
10
このように、continueを使うと「条件に合わないものは先に飛ばして、必要なものだけ処理する」という形でコードを書けます。
3-3. 配列の特定条件に一致する要素をスキップするサンプル
continueは、配列の要素を順番に処理するときにも便利です。
たとえば、点数の配列から60点未満のデータをスキップし、60点以上だけを表示する場合は次のように書けます。
C#using System;
class Program
{
static void Main()
{
int[] scores = { 80, 45, 90, 55, 70 };
for (int i = 0; i < scores.Length; i++)
{
if (scores[i] < 60)
{
continue;
}
Console.WriteLine(scores[i] + "点");
}
}
}
実行結果は次の通りです。
80点
90点
70点
45と55は60点未満なので、continueによって表示処理がスキップされます。
配列を使う場合、for文ではインデックス番号を使って要素にアクセスします。
C#scores[i]
このように書くことで、配列の中の現在の要素を取り出せます。
3-4. 空文字やnullを除外して処理するサンプル
文字列の配列を処理するときには、空文字やnullを除外したい場面があります。
たとえば、名前の一覧から有効な名前だけを表示する場合は次のように書けます。
C#using System;
class Program
{
static void Main()
{
string[] names = { "田中", "", "佐藤", null, "鈴木" };
for (int i = 0; i < names.Length; i++)
{
if (string.IsNullOrEmpty(names[i]))
{
continue;
}
Console.WriteLine(names[i]);
}
}
}
実行結果は次の通りです。
田中
佐藤
鈴木
string.IsNullOrEmptyは、文字列がnullまたは空文字かどうかを判定するメソッドです。
C#string.IsNullOrEmpty(names[i])
この条件がtrueの場合、処理対象外としてcontinueでスキップしています。
入力データやCSVデータ、フォームから受け取った値などを処理するときに、空のデータを除外する目的でよく使える書き方です。
4. continueを使った処理の流れを詳しく解説
continueは便利な命令ですが、どのタイミングでどの処理が実行されるのかを理解しておくことが大切です。
ここでは、continueが実行される前後の流れを詳しく見ていきます。
4-1. continue実行前の処理はそのまま実行される
continueが実行される前に書かれている処理は、通常通り実行されます。
C#for (int i = 1; i <= 3; i++)
{
Console.WriteLine("開始: " + i);
if (i == 2)
{
continue;
}
Console.WriteLine("終了: " + i);
}
実行結果は次の通りです。
開始: 1
終了: 1
開始: 2
開始: 3
終了: 3
iが2のときも、continueより前にあるConsole.WriteLine("開始: " + i);は実行されています。
つまり、continueは「そこに到達した時点から下の処理をスキップする」命令です。ループの先頭からすべてをなかったことにするわけではありません。
4-2. continueより下にある処理はスキップされる
continueが実行されると、それより下に書かれている処理は実行されません。
C#for (int i = 1; i <= 3; i++)
{
if (i == 2)
{
continue;
}
Console.WriteLine("処理中: " + i);
}
実行結果は次の通りです。
処理中: 1
処理中: 3
iが2のときはcontinueが実行されるため、Console.WriteLine("処理中: " + i);は実行されません。
この性質を利用すると、「処理したくない条件」を先に書いて、対象外のデータを早めに除外できます。
C#for (int i = 0; i < 5; i++)
{
if (i == 0)
{
continue;
}
Console.WriteLine(100 / i);
}
この例では、iが0のときに割り算をするとエラーになるため、continueでスキップしています。
4-3. for文の更新式に進んで次のループ判定へ移る
for文でcontinueが実行されると、次に進むのは更新式です。
たとえば、次のfor文では、各ループの最後にi++が実行されます。
C#for (int i = 0; i < 5; i++)
{
if (i == 2)
{
continue;
}
Console.WriteLine(i);
}
iが2のときにcontinueが実行されますが、その後もi++は実行されます。
そのため、次のループではiが3になります。
処理の流れは次のようになります。
i = 0 → 表示 → i++
i = 1 → 表示 → i++
i = 2 → continue → i++
i = 3 → 表示 → i++
i = 4 → 表示 → i++
つまり、continueを使ってもfor文の更新式は飛ばされません。
これはfor文でcontinueを使う上で重要なポイントです。
4-4. Console.WriteLineを使って実行順を確認する
実際にConsole.WriteLineを使うと、continueによる処理の流れを確認しやすくなります。
C#using System;
class Program
{
static void Main()
{
for (int i = 1; i <= 3; i++)
{
Console.WriteLine("ループ開始: " + i);
if (i == 2)
{
Console.WriteLine("continueを実行: " + i);
continue;
}
Console.WriteLine("通常処理: " + i);
}
Console.WriteLine("ループ終了");
}
}
実行結果は次の通りです。
ループ開始: 1
通常処理: 1
ループ開始: 2
continueを実行: 2
ループ開始: 3
通常処理: 3
ループ終了
iが2のときは、continueより下にある通常処理が表示されていません。
しかし、ループ自体は終了していないため、iが3の処理は実行されています。
このように、Console.WriteLineを使って途中経過を表示すると、continueの動きが理解しやすくなります。
5. continueとbreakの違い
continueとbreakは、どちらもループの流れを制御する命令です。
しかし、使い方を間違えるとプログラムの動きが大きく変わります。
ここでは、continueとbreakの違いを詳しく確認しましょう。
5-1. continueは1回分の処理だけをスキップする
continueは、現在の1回分の処理だけをスキップします。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次の通りです。
1
2
4
5
iが3のときだけ表示処理をスキップしていますが、ループはその後も続いています。
つまり、continueは「この回だけ処理しない」という意味で使います。
5-2. breakはループ処理そのものを終了する
breakは、ループ処理そのものを終了します。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
break;
}
Console.WriteLine(i);
}
実行結果は次の通りです。
1
2
iが3になった時点でbreakが実行され、for文が終了します。
そのため、4と5は処理されません。
breakは「これ以上ループを続ける必要がない」ときに使います。
5-3. continueとbreakの比較サンプルコード
continueとbreakの違いを比較するために、同じ条件で動かしてみましょう。
まずはcontinueです。
C#Console.WriteLine("continueの場合");
for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次の通りです。
continueの場合
1
2
4
5
次にbreakです。
C#Console.WriteLine("breakの場合");
for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
break;
}
Console.WriteLine(i);
}
実行結果は次の通りです。
breakの場合
1
2
違いを整理すると、次のようになります。
| 制御文 | 動き | ループは続くか |
|---|---|---|
| continue | 現在の処理をスキップして次へ進む | 続く |
| break | ループを終了する | 続かない |
continueはスキップ、breakは終了と覚えておきましょう。
5-4. どちらを使うべきか判断するポイント
continueとbreakのどちらを使うべきかは、目的によって決まります。
特定のデータだけを処理対象外にしたい場合は、continueを使います。
C#for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
{
continue;
}
Console.WriteLine(i);
}
このコードでは、偶数だけをスキップして、奇数の処理は続けます。
一方、条件に一致した時点で繰り返しを終えたい場合は、breakを使います。
C#for (int i = 1; i <= 10; i++)
{
if (i == 5)
{
break;
}
Console.WriteLine(i);
}
このコードでは、iが5になった時点でループが終了します。
処理を続けたいならcontinue、処理を終えたいならbreakを使うと判断すると分かりやすいです。
6. ネストしたfor文でcontinueを使う場合の注意点
for文の中にさらにfor文を書くことを、ネストしたfor文、または二重ループと呼びます。
ネストしたfor文でcontinueを使う場合、どのループに対してcontinueが働くのかを理解しておくことが大切です。
6-1. continueが影響するのは内側のループだけ
ネストしたfor文の内側でcontinueを使った場合、影響するのは基本的にそのcontinueが書かれている内側のループだけです。
C#for (int i = 1; i <= 2; i++)
{
for (int j = 1; j <= 3; j++)
{
if (j == 2)
{
continue;
}
Console.WriteLine("i=" + i + ", j=" + j);
}
}
実行結果は次の通りです。
i=1, j=1
i=1, j=3
i=2, j=1
i=2, j=3
jが2のときだけ、内側のループの処理がスキップされています。
外側のiのループは通常通り続きます。
6-2. 外側のループには直接進まない
内側のfor文でcontinueを実行しても、外側のループの次の回へ直接進むわけではありません。
次のコードを見てみましょう。
C#for (int i = 1; i <= 2; i++)
{
Console.WriteLine("外側開始: " + i);
for (int j = 1; j <= 3; j++)
{
if (j == 2)
{
continue;
}
Console.WriteLine("内側: " + j);
}
Console.WriteLine("外側終了: " + i);
}
実行結果は次の通りです。
外側開始: 1
内側: 1
内側: 3
外側終了: 1
外側開始: 2
内側: 1
内側: 3
外側終了: 2
j == 2のときにcontinueが実行されても、スキップされるのは内側のループの残りの処理だけです。
外側のConsole.WriteLine("外側終了: " + i);は通常通り実行されます。
6-3. 二重ループでcontinueを使うサンプル
二重ループでcontinueを使う例として、九九の一部をスキップするコードを見てみましょう。
C#using System;
class Program
{
static void Main()
{
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 3; j++)
{
if (j == 2)
{
continue;
}
Console.WriteLine(i + " × " + j + " = " + (i * j));
}
}
}
}
実行結果は次の通りです。
1 × 1 = 1
1 × 3 = 3
2 × 1 = 2
2 × 3 = 6
3 × 1 = 3
3 × 3 = 9
このコードでは、内側のループでj == 2のときにcontinueを実行しています。
そのため、各iに対してjが2の計算だけがスキップされます。
6-4. ネストが深い処理では可読性に注意する
ネストしたfor文の中でcontinueを使うと、処理の流れが分かりにくくなることがあります。
特に、次のようなコードは初心者には読みにくくなりがちです。
C#for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (i == 1)
{
continue;
}
if (j == 2)
{
continue;
}
Console.WriteLine("i=" + i + ", j=" + j);
}
}
複数のcontinueがあると、どの条件でどの処理がスキップされるのか追いにくくなります。
ネストが深い処理では、条件を分かりやすく書く、メソッドに分ける、コメントを追加するなど、可読性を意識することが大切です。
7. continueを使うメリットと使いどころ
continueは必ず使わなければならない命令ではありませんが、うまく使うとコードを読みやすくできます。
ここでは、continueを使うメリットと具体的な使いどころを解説します。
7-1. 条件に合わない処理を早めにスキップできる
continueを使うと、処理対象外のデータを早い段階でスキップできます。
C#for (int i = 0; i < 10; i++)
{
if (i < 5)
{
continue;
}
Console.WriteLine(i);
}
このコードでは、iが5未満の場合は処理をスキップし、5以上の場合だけ表示しています。
実行結果は次の通りです。
5
6
7
8
9
先に対象外の条件を書いておくことで、「ここから下は処理対象のデータだけ」と考えやすくなります。
7-2. if文のネストを浅くして読みやすくできる
continueを使うと、if文のネストを浅くできます。
たとえば、continueを使わない場合は次のようになります。
C#for (int i = 1; i <= 10; i++)
{
if (i % 2 != 0)
{
Console.WriteLine(i);
}
}
このコードでも問題ありませんが、処理が増えるとif文の中が長くなります。
continueを使うと、次のように書けます。
C#for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
{
continue;
}
Console.WriteLine(i);
}
この書き方では、偶数を先に除外しています。
処理が長い場合は、対象外の条件を先にcontinueでスキップした方が読みやすくなることがあります。
7-3. 入力チェックやデータ抽出で使いやすい
continueは、入力チェックやデータ抽出の処理でよく使えます。
たとえば、ユーザー名の一覧から空のデータを除外して表示する場合は次のように書けます。
C#string[] users = { "user01", "", "user02", null, "user03" };
for (int i = 0; i < users.Length; i++)
{
if (string.IsNullOrEmpty(users[i]))
{
continue;
}
Console.WriteLine(users[i]);
}
実行結果は次の通りです。
user01
user02
user03
空文字やnullのデータを先に除外できるため、その後の処理では有効なデータだけを扱えます。
7-4. 処理対象外のデータを除外する場面で便利
continueは、処理対象外のデータを除外したい場面で便利です。
たとえば、商品の価格一覧から0円の商品を除外して処理する場合は次のように書けます。
C#int[] prices = { 1200, 0, 800, 0, 1500 };
for (int i = 0; i < prices.Length; i++)
{
if (prices[i] == 0)
{
continue;
}
Console.WriteLine(prices[i] + "円");
}
実行結果は次の通りです。
1200円
800円
1500円
0円の商品は処理対象外としてスキップされます。
このように、continueは「必要なデータだけを残して処理したい」ときに役立ちます。
8. continueを使うときの注意点
continueは便利ですが、使い方を間違えると意図しない処理のスキップが発生します。
ここでは、C#のfor文でcontinueを使うときの注意点を確認しましょう。
8-1. continueの後ろにある処理は実行されない
最も重要な注意点は、continueの後ろにある処理は実行されないということです。
C#for (int i = 1; i <= 3; i++)
{
if (i == 2)
{
continue;
}
Console.WriteLine("表示: " + i);
}
このコードでは、iが2のときにConsole.WriteLineが実行されません。
また、次のようなコードを書くと注意が必要です。
C#for (int i = 1; i <= 3; i++)
{
if (i == 2)
{
continue;
Console.WriteLine("この行は実行されません");
}
Console.WriteLine(i);
}
continueの直後に書いた処理は実行されません。実際には、このような到達できないコードはコンパイル時にエラーになる場合があります。
continueの後ろに重要な処理を書かないように注意しましょう。
8-2. 条件を間違えると必要な処理までスキップしてしまう
continueは条件に一致したときに処理をスキップします。
そのため、条件式を間違えると、本来処理すべきデータまでスキップしてしまいます。
たとえば、奇数だけを表示したい場合は、偶数をスキップする必要があります。
C#for (int i = 1; i <= 5; i++)
{
if (i % 2 == 0)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次の通りです。
1
3
5
しかし、条件を間違えて次のように書くと、奇数がスキップされてしまいます。
C#for (int i = 1; i <= 5; i++)
{
if (i % 2 != 0)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次の通りです。
2
4
continueを使うときは、「スキップしたい条件」を書いているのか、「処理したい条件」を書いているのかを明確にすることが大切です。
8-3. 多用すると処理の流れが分かりにくくなる
continueを多用すると、処理の流れが追いにくくなることがあります。
C#for (int i = 0; i < 10; i++)
{
if (i == 1)
{
continue;
}
if (i == 3)
{
continue;
}
if (i == 5)
{
continue;
}
Console.WriteLine(i);
}
このコードでも動作はしますが、条件が増えると読みにくくなります。
このような場合は、条件をまとめると分かりやすくなります。
C#for (int i = 0; i < 10; i++)
{
if (i == 1 || i == 3 || i == 5)
{
continue;
}
Console.WriteLine(i);
}
さらに条件が複雑な場合は、判定用のメソッドを作ることも検討できます。
C#static bool ShouldSkip(int value)
{
return value == 1 || value == 3 || value == 5;
}
continueは便利ですが、使いすぎると可読性が下がるため、必要な場面に絞って使うことが大切です。
8-4. 無限ループとの違いとfor文での安全性
continueを使うと無限ループになるのではないかと心配する人もいるかもしれません。
通常のfor文では、continueが実行されても更新式が実行されるため、無限ループになりにくいです。
C#for (int i = 0; i < 5; i++)
{
if (i == 2)
{
continue;
}
Console.WriteLine(i);
}
このコードでは、i == 2のときにcontinueが実行されますが、その後にi++が行われます。
そのため、次のループではiが3になり、処理は進みます。
ただし、更新式を書かない特殊なfor文や、while文でcontinueを使う場合は注意が必要です。
C#int i = 0;
while (i < 5)
{
if (i == 2)
{
continue;
}
i++;
}
このコードでは、iが2になった後にcontinueが実行されると、i++が実行されません。そのため、iがずっと2のままになり、無限ループになります。
for文では更新式があるため比較的安全ですが、ループ変数が正しく更新されるかどうかは必ず確認しましょう。
9. continueを使わずに書く方法との比較
continueを使わなくても、if文だけで同じ処理を書くことはできます。
ここでは、continueを使わない書き方と使う書き方を比較して、どちらが読みやすいかを考えてみましょう。
9-1. if文だけで条件分岐する書き方
たとえば、1から10までの数値のうち、奇数だけを表示したい場合は、if文だけで次のように書けます。
C#for (int i = 1; i <= 10; i++)
{
if (i % 2 != 0)
{
Console.WriteLine(i);
}
}
実行結果は次の通りです。
1
3
5
7
9
この書き方では、「奇数の場合だけ表示する」という条件になっています。
シンプルな処理であれば、この書き方でも十分分かりやすいです。
9-2. continueを使った書き方
同じ処理をcontinueを使って書くと、次のようになります。
C#for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
{
continue;
}
Console.WriteLine(i);
}
このコードでは、「偶数の場合はスキップする」という条件になっています。
結果は同じです。
1
3
5
7
9
continueを使うことで、処理対象外の条件を先に除外し、その後に本来の処理を書く形になります。
9-3. コードの読みやすさを比較する
if文だけの書き方は、処理が短い場合に読みやすいです。
C#for (int i = 1; i <= 10; i++)
{
if (i % 2 != 0)
{
Console.WriteLine(i);
}
}
一方、処理が長くなる場合は、continueを使った方が読みやすくなることがあります。
C#for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
{
continue;
}
Console.WriteLine("処理開始");
Console.WriteLine("値: " + i);
Console.WriteLine("処理終了");
}
対象外の条件を先にスキップすることで、メインの処理を深いネストの中に書かずに済みます。
特に、条件チェックが複数ある場合はcontinueが役立ちます。
C#for (int i = 0; i < names.Length; i++)
{
if (string.IsNullOrEmpty(names[i]))
{
continue;
}
if (names[i].Length < 2)
{
continue;
}
Console.WriteLine(names[i]);
}
このように書くと、条件に合わないデータを順番に除外し、最後に有効なデータだけを処理できます。
9-4. 初心者が選びやすい書き方
初心者の場合、まずはif文だけで書く方法を理解するとよいでしょう。
処理が短い場合は、無理にcontinueを使う必要はありません。
C#for (int i = 1; i <= 5; i++)
{
if (i != 3)
{
Console.WriteLine(i);
}
}
ただし、処理対象外の条件を先に除外したい場合や、if文のネストが深くなりそうな場合は、continueを使うと読みやすくなります。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
最初のうちは、「スキップしたい条件が明確なときにcontinueを使う」と考えると使いやすいです。
10. C#のfor文とcontinueに関するよくある質問
最後に、C#のfor文とcontinueに関するよくある質問を紹介します。
10-1. continueはwhile文やforeach文でも使えるのか
はい、continueはfor文だけでなく、while文やforeach文でも使えます。
while文で使う例は次の通りです。
C#int i = 0;
while (i < 5)
{
i++;
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次の通りです。
1
2
4
5
foreach文で使う例は次の通りです。
C#string[] names = { "田中", "", "佐藤" };
foreach (string name in names)
{
if (string.IsNullOrEmpty(name))
{
continue;
}
Console.WriteLine(name);
}
実行結果は次の通りです。
田中
佐藤
ただし、while文ではループ変数の更新位置に注意が必要です。continueによって更新処理がスキップされると、無限ループになる可能性があります。
10-2. continueの後にコードを書くとどうなるのか
continueの後に書いたコードは実行されません。
C#for (int i = 0; i < 3; i++)
{
continue;
Console.WriteLine(i);
}
この場合、Console.WriteLine(i);には到達できません。
C#では、到達できないコードがあるとコンパイルエラーになることがあります。
実際のコードでは、continueの後ろに処理を書かないようにしましょう。
通常は次のように、if文の中でcontinueを使います。
C#for (int i = 0; i < 3; i++)
{
if (i == 1)
{
continue;
}
Console.WriteLine(i);
}
この書き方であれば、i == 1のときだけスキップし、それ以外のときは表示処理が実行されます。
10-3. continueとreturnの違いは何か
continueは、ループの現在の1回分の処理をスキップして、次のループへ進む命令です。
一方、returnはメソッドの処理そのものを終了する命令です。
C#static void TestContinue()
{
for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
Console.WriteLine("TestContinue終了");
}
この場合、i == 3のときだけスキップされ、最後のTestContinue終了も表示されます。
実行結果は次の通りです。
1
2
4
5
TestContinue終了
一方、returnを使うとメソッド自体が終了します。
C#static void TestReturn()
{
for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
return;
}
Console.WriteLine(i);
}
Console.WriteLine("TestReturn終了");
}
実行結果は次の通りです。
1
2
i == 3のときにreturnが実行され、メソッドが終了します。そのため、TestReturn終了は表示されません。
continueはループの制御、returnはメソッドの終了と覚えておきましょう。
10-4. continueを使うとパフォーマンスは良くなるのか
continueを使ったからといって、必ず大きくパフォーマンスが良くなるわけではありません。
ただし、不要な処理を早めにスキップできるため、重い処理を避けられる場合には効果があります。
たとえば、条件に合わないデータに対して複雑な処理を実行しないようにする場合です。
C#for (int i = 0; i < data.Length; i++)
{
if (data[i] < 0)
{
continue;
}
// ここに時間のかかる処理を書く
Console.WriteLine(data[i]);
}
このコードでは、負の値の場合は重い処理に進む前にスキップできます。
ただし、通常の短い処理では、continueを使うかどうかによる速度差を気にしすぎる必要はありません。
多くの場合、continueはパフォーマンス目的よりも、コードを分かりやすくするために使うものです。
まとめ
C#のfor文でcontinueを使うと、現在のループ処理を途中でスキップして、次の繰り返しへ進めることができます。
基本的な書き方は次の通りです。
C#for (int i = 0; i < 10; i++)
{
if (スキップしたい条件)
{
continue;
}
// 条件に当てはまらなかった場合の処理
}
continueは、特定の数値をスキップしたい場合、偶数や奇数だけを処理したい場合、配列の中から条件に合わない要素を除外したい場合、空文字やnullを無視したい場合などに便利です。
また、breakとの違いも重要です。
continueは現在の1回分の処理だけをスキップして、ループは続行します。一方、breakはループそのものを終了します。
C#// continueはスキップ
if (条件)
{
continue;
}
// breakは終了
if (条件)
{
break;
}
continueを使うと、条件に合わない処理を早めに除外でき、if文のネストを浅くしてコードを読みやすくできます。
ただし、continueの後ろにある処理は実行されないため、必要な処理までスキップしないように条件式には注意が必要です。また、多用すると処理の流れが分かりにくくなることもあります。
C#のfor文で繰り返し処理を書くときは、「この回だけ処理を飛ばしたい」ときにcontinueを使うと覚えておきましょう。

