C# for文の使い方を初心者向けに徹底解説|基本構文・foreachとの違い・実践例まで

はじめに

C#でプログラムを書いていると、「同じ処理を何度も繰り返したい」という場面がよくあります。たとえば、1から10までの数字を表示したい、配列の中身を順番に取り出したい、リスト内のデータをすべてチェックしたい、といった処理です。

このような繰り返し処理でよく使われるのが、C#のfor文です。

for文は、繰り返す回数があらかじめ決まっている場合に特に便利な構文です。C#初心者にとって最初は少し複雑に見えるかもしれませんが、基本の形と動き方を理解すれば、配列、List、文字列処理、計算処理などさまざまな場面で使えるようになります。

この記事では、C#のfor文の基本構文から、foreach文while文との違い、実践的なサンプルコード、初心者がやりがちなエラー、練習問題までわかりやすく解説します。

1. C#のfor文とは?繰り返し処理を行う基本構文

1-1. for文は「決まった回数だけ処理を繰り返す」ための構文

C#のfor文は、同じ処理を決まった回数だけ繰り返したいときに使う構文です。

たとえば、次のような処理を考えてみましょう。

C#
Console.WriteLine("こんにちは");
Console.WriteLine("こんにちは");
Console.WriteLine("こんにちは");
Console.WriteLine("こんにちは");
Console.WriteLine("こんにちは");

このように同じ処理を何度も書くのは大変です。回数が5回ならまだよいですが、100回、1000回となると現実的ではありません。

そこでfor文を使うと、次のように短く書けます。

C#
for (int i = 0; i < 5; i++)
{
Console.WriteLine("こんにちは");
}

このコードは、「こんにちは」を5回表示します。

for文を使うことで、同じ処理を効率よく、読みやすく書けるようになります。

1-2. C#でfor文を使う代表的な場面

C#でfor文を使う代表的な場面には、次のようなものがあります。

C#
// 決まった回数だけ処理を繰り返す
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}
C#
// 配列の要素を順番に処理する
int[] scores = { 80, 90, 75 };

for (int i = 0; i < scores.Length; i++)
{
Console.WriteLine(scores[i]);
}
C#
// Listの要素をインデックス付きで処理する
List<string> names = new List<string> { "田中", "佐藤", "鈴木" };

for (int i = 0; i < names.Count; i++)
{
Console.WriteLine($"{i}番目: {names[i]}");
}

for文は、特に「何回繰り返すかが明確な処理」や「インデックス番号を使って要素にアクセスしたい処理」でよく使われます。

1-3. for文を学ぶ前に知っておきたい「ループ」と「カウンタ変数」

for文を理解するためには、まず「ループ」と「カウンタ変数」という考え方を知っておくとスムーズです。

ループとは、同じ処理を繰り返すことです。

C#
for (int i = 0; i < 3; i++)
{
Console.WriteLine("ループ中");
}

このコードでは、Console.WriteLine("ループ中");が3回実行されます。

カウンタ変数とは、現在何回目の繰り返しなのかを管理するための変数です。多くの場合、iという名前が使われます。

C#
for (int i = 0; i < 3; i++)
{
Console.WriteLine(i);
}

実行結果は次のようになります。

C#
0
1
2

iの値が、0、1、2と変化していることがわかります。このiがカウンタ変数です。

2. C#のfor文の基本構文と書き方

2-1. for文の基本形

C#のfor文の基本形は次のとおりです。

C#
for (初期化式; 条件式; 反復式)
{
繰り返したい処理;
}

実際のコードでは、次のように書きます。

C#
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}

このコードは、0から4までの数値を表示します。

C#
0
1
2
3
4

for文は、丸かっこの中に3つの要素を書きます。

C#
for (int i = 0; i < 5; i++)

左から順番に、次の意味を持ちます。

C#
int i = 0  // 初期化式
i < 5 // 条件式
i++ // 反復式

この3つを理解することが、C#のfor文を使いこなす第一歩です。

2-2. 初期化式・条件式・反復式の役割

for文の中にある3つの式には、それぞれ役割があります。

C#
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}

int i = 0は初期化式です。ループが始まる前に一度だけ実行されます。ここでは、カウンタ変数iを0で初期化しています。

i < 5は条件式です。この条件がtrueの間、ループ処理が実行されます。iが5以上になると条件がfalseになり、ループが終了します。

i++は反復式です。ループ本体の処理が1回終わるたびに実行されます。ここでは、iの値を1ずつ増やしています。

流れを簡単に表すと、次のようになります。

C#
1. int i = 0 を実行する
2. i < 5 を判定する
3. trueなら処理を実行する
4. i++ を実行する
5. 再び i < 5 を判定する
6. falseになるまで繰り返す

2-3. i++やi--の意味

for文でよく見るi++は、iの値を1増やすという意味です。

C#
i++;

これは次のコードと同じ意味です。

C#
i = i + 1;

たとえば、iが0のときにi++を実行すると、iは1になります。

一方、i--iの値を1減らすという意味です。

C#
i--;

これは次のコードと同じ意味です。

C#
i = i - 1;

逆順にループしたいときによく使います。

C#
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}

実行結果は次のようになります。

C#
5
4
3
2
1

i++は1ずつ増やす、i--は1ずつ減らす、と覚えておきましょう。

2-4. まずは1から10まで表示するシンプルなサンプル

C#のfor文で1から10まで表示するコードは次のとおりです。

C#
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(i);
}

実行結果は次のようになります。

C#
1
2
3
4
5
6
7
8
9
10

ここでは、iを1から始めています。

C#
int i = 1

そして、iが10以下の間だけ繰り返します。

C#
i <= 10

最後に、1回処理が終わるたびにi++で値を1増やします。

C#
i++

このように、for文では「どこから始めるか」「いつまで繰り返すか」「どのように値を変化させるか」を自分で決めることができます。

3. for文の動き方を順番に理解しよう

3-1. for文が実行される流れ

for文は、次の順番で実行されます。

C#
for (int i = 0; i < 3; i++)
{
Console.WriteLine(i);
}

このコードを例にすると、処理の流れは次のようになります。

C#
1. int i = 0 が実行される
2. i < 3 が判定される
3. trueなので Console.WriteLine(i); が実行される
4. i++ が実行される
5. i < 3 が再び判定される
6. trueなら再び処理が実行される
7. iが3になると i < 3 がfalseになり終了する

実際には、次のように動きます。

C#
i = 0  条件 true  0を表示  i++で1になる
i = 1 条件 true 1を表示 i++で2になる
i = 2 条件 true 2を表示 i++で3になる
i = 3 条件 false 終了

そのため、実行結果は次のようになります。

C#
0
1
2

3-2. 条件式がtrueの間だけ繰り返される

for文は、条件式がtrueの間だけ処理を繰り返します。

C#
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}

この場合、条件式は次の部分です。

C#
i < 5

iが0、1、2、3、4のときはtrueです。

しかし、iが5になると、i < 5falseになります。その時点でループは終了します。

つまり、for文の繰り返し回数は条件式によって決まります。

3-3. ループ終了のタイミング

for文は、条件式がfalseになったタイミングで終了します。

次のコードを見てみましょう。

C#
for (int i = 1; i <= 3; i++)
{
Console.WriteLine(i);
}

Console.WriteLine("終了しました");

実行結果は次のようになります。

C#
1
2
3
終了しました

iが4になった時点で、条件式i <= 3falseになるため、for文の中の処理は実行されません。その後、for文の外側にある処理が実行されます。

ループがいつ終わるのかを理解するには、条件式をよく確認することが大切です。

3-4. 初心者がつまずきやすい「0から始まる」考え方

C#では、配列やListのインデックスは0から始まります。

C#
string[] fruits = { "りんご", "バナナ", "みかん" };

Console.WriteLine(fruits[0]); // りんご
Console.WriteLine(fruits[1]); // バナナ
Console.WriteLine(fruits[2]); // みかん

要素が3つある場合、インデックスは0、1、2です。最後のインデックスは3ではありません。

そのため、配列をfor文で処理するときは、次のように書きます。

C#
for (int i = 0; i < fruits.Length; i++)
{
Console.WriteLine(fruits[i]);
}

ここで重要なのは、条件式にi <= fruits.Lengthではなく、i < fruits.Lengthを使うことです。

C#
i < fruits.Length

配列の長さが3の場合、fruits.Lengthは3です。しかし、使えるインデックスは0、1、2までです。

i <= fruits.Lengthと書いてしまうと、fruits[3]にアクセスしようとしてエラーになります。

4. C#のfor文でよく使う実践パターン

4-1. 指定回数だけ処理を繰り返す

指定した回数だけ処理を繰り返したい場合、for文はとても便利です。

C#
for (int i = 0; i < 5; i++)
{
Console.WriteLine("処理を実行します");
}

このコードは、メッセージを5回表示します。

「5回繰り返す」という処理では、iを0から始めて、i < 5まで繰り返す書き方がよく使われます。

C#
for (int i = 0; i < 回数; i++)
{
繰り返したい処理;
}

たとえば、10回処理したい場合は次のように書きます。

C#
for (int i = 0; i < 10; i++)
{
Console.WriteLine("10回のうちの1回です");
}

4-2. 配列の要素を順番に取り出す

配列の中身を順番に取り出すときにも、for文はよく使われます。

C#
int[] numbers = { 10, 20, 30, 40, 50 };

for (int i = 0; i < numbers.Length; i++)
{
Console.WriteLine(numbers[i]);
}

実行結果は次のようになります。

C#
10
20
30
40
50

配列の要素数はLengthで取得できます。

C#
numbers.Length

配列のインデックスは0から始まるため、i < numbers.Lengthと書くのが基本です。

C#
for (int i = 0; i < numbers.Length; i++)

この形は非常によく使うので、覚えておきましょう。

4-3. Listの要素をインデックス付きで処理する

C#では、配列だけでなくListもよく使います。Listの要素数はCountで取得できます。

C#
List<string> names = new List<string> { "田中", "佐藤", "鈴木" };

for (int i = 0; i < names.Count; i++)
{
Console.WriteLine($"{i}: {names[i]}");
}

実行結果は次のようになります。

C#
0: 田中
1: 佐藤
2: 鈴木

Listの中身だけでなく、「何番目のデータか」も一緒に扱いたい場合は、foreach文よりもfor文が向いています。

C#
Console.WriteLine($"{i + 1}番目の名前は{names[i]}です");

このように書けば、ユーザーに見せる番号を1番目、2番目、3番目のように表示できます。

4-4. 逆順にループする

for文では、値を増やすだけでなく、減らしながら繰り返すこともできます。

C#
for (int i = 5; i >= 1; i--)
{
Console.WriteLine(i);
}

実行結果は次のようになります。

C#
5
4
3
2
1

配列を後ろから順番に処理したい場合にも使えます。

C#
string[] fruits = { "りんご", "バナナ", "みかん" };

for (int i = fruits.Length - 1; i >= 0; i--)
{
Console.WriteLine(fruits[i]);
}

実行結果は次のようになります。

C#
みかん
バナナ
りんご

配列の最後のインデックスはLength - 1です。

C#
fruits.Length - 1

この考え方は、逆順ループでとても重要です。

4-5. 2つ飛ばし・偶数だけ・奇数だけ処理する

for文の反復式を変えることで、1ずつではなく2ずつ増やすこともできます。

C#
for (int i = 0; i <= 10; i += 2)
{
Console.WriteLine(i);
}

実行結果は次のようになります。

C#
0
2
4
6
8
10

i += 2は、iを2ずつ増やすという意味です。

C#
i = i + 2;

奇数だけ表示したい場合は、1から始めて2ずつ増やします。

C#
for (int i = 1; i <= 10; i += 2)
{
Console.WriteLine(i);
}

実行結果は次のようになります。

C#
1
3
5
7
9

また、if文と組み合わせて偶数だけ処理することもできます。

C#
for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
{
Console.WriteLine(i);
}
}

%は割り算の余りを求める演算子です。i % 2 == 0は、「2で割った余りが0」、つまり偶数であることを意味します。

4-6. 合計値や平均値を計算する

for文は、数値の合計や平均を求めるときにもよく使われます。

C#
int[] scores = { 80, 90, 70, 60, 100 };
int total = 0;

for (int i = 0; i < scores.Length; i++)
{
total += scores[i];
}

Console.WriteLine($"合計: {total}");

実行結果は次のようになります。

C#
合計: 400

total += scores[i]は、現在のtotalscores[i]を加えるという意味です。

C#
total = total + scores[i];

平均値を求める場合は、合計を要素数で割ります。

C#
int[] scores = { 80, 90, 70, 60, 100 };
int total = 0;

for (int i = 0; i < scores.Length; i++)
{
total += scores[i];
}

double average = (double)total / scores.Length;

Console.WriteLine($"平均: {average}");

(double)totalと書くことで、小数点を含む計算ができます。

5. for文とforeach文の違い・使い分け

5-1. foreach文とは

foreach文は、配列やListなどの要素を1つずつ順番に取り出すための構文です。

C#
string[] fruits = { "りんご", "バナナ", "みかん" };

foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}

実行結果は次のようになります。

C#
りんご
バナナ
みかん

foreach文は、インデックスを意識せずに要素を取り出せるため、コードがシンプルになります。

5-2. for文とforeach文の基本構文の違い

for文では、カウンタ変数を使って要素にアクセスします。

C#
string[] fruits = { "りんご", "バナナ", "みかん" };

for (int i = 0; i < fruits.Length; i++)
{
Console.WriteLine(fruits[i]);
}

一方、foreach文では、要素そのものを順番に取り出します。

C#
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}

for文はインデックスを使えるため、現在の位置を知りたい場合に便利です。

foreach文はコードが短く読みやすいため、全要素を順番に読むだけなら便利です。

5-3. インデックスが必要な場合はfor文

要素の番号や位置が必要な場合は、for文を使うのが適しています。

C#
string[] names = { "田中", "佐藤", "鈴木" };

for (int i = 0; i < names.Length; i++)
{
Console.WriteLine($"{i + 1}番目: {names[i]}");
}

実行結果は次のようになります。

C#
1番目: 田中
2番目: 佐藤
3番目: 鈴木

このように、要素だけでなく「何番目か」を表示したい場合、for文が便利です。

また、前後の要素と比較したい場合にもfor文が向いています。

C#
int[] numbers = { 10, 20, 15, 30 };

for (int i = 1; i < numbers.Length; i++)
{
Console.WriteLine($"{numbers[i - 1]} と {numbers[i]} を比較します");
}

5-4. 全要素を順番に読むだけならforeach文

配列やListの中身を順番に読むだけなら、foreach文の方がシンプルです。

C#
List<string> names = new List<string> { "田中", "佐藤", "鈴木" };

foreach (string name in names)
{
Console.WriteLine(name);
}

このコードでは、インデックス番号を使っていません。要素を1つずつ取り出して表示するだけなら、foreach文の方が読みやすくなります。

初心者のうちは、次のように考えるとよいでしょう。

C#
インデックスが必要  for文
要素を読むだけ foreach文

5-5. 配列やListの値を変更したい場合の注意点

配列の値を変更したい場合は、for文を使うとわかりやすいです。

C#
int[] numbers = { 1, 2, 3 };

for (int i = 0; i < numbers.Length; i++)
{
numbers[i] = numbers[i] * 2;
}

foreach (int number in numbers)
{
Console.WriteLine(number);
}

実行結果は次のようになります。

C#
2
4
6

foreach文では、取り出した変数に直接代入して要素を変更することはできません。

C#
foreach (int number in numbers)
{
// number = number * 2; // エラーになる
}

要素の値を変更したい場合は、インデックスを使えるfor文を使うのが基本です。

ただし、Listの要素をループ中に追加・削除する場合は注意が必要です。ループ中に要素数が変わると、思わぬエラーや処理漏れが起こることがあります。

5-6. for文とforeach文の使い分け早見表

やりたいこと向いている構文
決まった回数だけ繰り返すfor文
インデックス番号を使いたいfor文
配列やListの値を変更したいfor文
全要素を順番に読むだけforeach文
コードをシンプルに書きたいforeach文
逆順に処理したいfor文

for文foreach文はどちらか一方だけを使うものではありません。目的に応じて使い分けることが大切です。

6. for文とwhile文・do while文の違い

6-1. while文との違い

while文も繰り返し処理を行う構文です。

C#
int i = 0;

while (i < 5)
{
Console.WriteLine(i);
i++;
}

このコードは、for文で書くと次のようになります。

C#
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}

for文は、初期化、条件、増減が1行にまとまっているため、繰り返し回数が決まっている場合に読みやすくなります。

一方、while文は「ある条件を満たしている間、繰り返す」という書き方に向いています。

6-2. do while文との違い

do while文は、条件判定を後で行う繰り返し構文です。

C#
int i = 0;

do
{
Console.WriteLine(i);
i++;
}
while (i < 5);

while文は最初に条件を判定しますが、do while文は最初に処理を実行してから条件を判定します。

そのため、do while文は条件に関係なく最低1回は処理が実行されます。

C#
int i = 10;

do
{
Console.WriteLine(i);
i++;
}
while (i < 5);

この場合、i < 5は最初からfalseですが、処理は1回実行されます。

6-3. 繰り返し回数が決まっているならfor文が向いている

繰り返し回数が明確な場合は、for文が向いています。

C#
for (int i = 0; i < 10; i++)
{
Console.WriteLine("10回繰り返します");
}

配列やListの要素数分だけ処理したい場合も、for文が便利です。

C#
int[] numbers = { 10, 20, 30 };

for (int i = 0; i < numbers.Length; i++)
{
Console.WriteLine(numbers[i]);
}

「何回繰り返すか」がコードから読み取りやすい点が、for文の大きなメリットです。

6-4. 条件によって繰り返すならwhile文が向いている

繰り返し回数が決まっておらず、条件によって処理を続けたい場合はwhile文が向いています。

C#
int number = 0;

while (number < 100)
{
number += 15;
Console.WriteLine(number);
}

このように、「特定の条件になるまで繰り返す」という処理では、while文の方が自然に書けることがあります。

たとえば、ユーザーが正しい値を入力するまで繰り返す処理などもwhile文で書かれることが多いです。

7. for文で使える便利な制御構文

7-1. breakでループを途中終了する

breakを使うと、for文のループを途中で終了できます。

C#
for (int i = 1; i <= 10; i++)
{
if (i == 5)
{
break;
}

Console.WriteLine(i);
}

実行結果は次のようになります。

C#
1
2
3
4

iが5になった時点でbreakが実行され、ループ全体が終了します。

特定のデータを見つけたら処理を終えたい場合などに便利です。

C#
int[] numbers = { 10, 20, 30, 40 };

for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i] == 30)
{
Console.WriteLine("30が見つかりました");
break;
}
}

7-2. continueで特定の処理をスキップする

continueを使うと、現在の回だけ処理をスキップして、次のループに進めます。

C#
for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}

Console.WriteLine(i);
}

実行結果は次のようになります。

C#
1
2
4
5

iが3のときだけConsole.WriteLine(i);が実行されず、次のループに進みます。

偶数だけスキップする場合は、次のように書けます。

C#
for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
{
continue;
}

Console.WriteLine(i);
}

このコードは奇数だけを表示します。

7-3. if文と組み合わせて条件分岐する

for文の中では、if文を使って条件分岐できます。

C#
for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
{
Console.WriteLine($"{i}は偶数です");
}
else
{
Console.WriteLine($"{i}は奇数です");
}
}

実行結果は次のようになります。

C#
1は奇数です
2は偶数です
3は奇数です
4は偶数です
5は奇数です
6は偶数です
7は奇数です
8は偶数です
9は奇数です
10は偶数です

for文if文を組み合わせることで、繰り返しながら条件に応じた処理を行えます。

7-4. ネストしたfor文で二重ループを作る

for文の中にさらにfor文を書くこともできます。これをネスト、または二重ループと呼びます。

C#
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 3; j++)
{
Console.WriteLine($"i={i}, j={j}");
}
}

実行結果は次のようになります。

C#
i=1, j=1
i=1, j=2
i=1, j=3
i=2, j=1
i=2, j=2
i=2, j=3
i=3, j=1
i=3, j=2
i=3, j=3

外側のループが1回実行されるたびに、内側のループが最初から最後まで実行されます。

二重ループは、表形式のデータ、九九表、2次元配列などを扱うときによく使います。

8. 初心者がやりがちなfor文のエラーと対処法

8-1. セミコロンの書き忘れ・位置の間違い

for文の丸かっこの中では、初期化式、条件式、反復式をセミコロンで区切ります。

C#
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}

正しい形は次のとおりです。

C#
for (初期化式; 条件式; 反復式)

セミコロンを書き忘れるとエラーになります。

C#
// 間違い
for (int i = 0 i < 5 i++)
{
Console.WriteLine(i);
}

また、for文の直後に余計なセミコロンを付けるのも注意が必要です。

C#
// 間違いやすい例
for (int i = 0; i < 5; i++);
{
Console.WriteLine("表示");
}

この場合、for文の中身が空の処理になってしまい、意図した動きになりません。

8-2. 条件式のミスによる無限ループ

条件式を間違えると、ループが終わらない無限ループになることがあります。

C#
for (int i = 0; i < 5; i--)
{
Console.WriteLine(i);
}

このコードでは、iが0から始まり、i--でどんどん小さくなります。そのため、i < 5がずっとtrueのままになり、ループが終わりません。

正しくは次のように書きます。

C#
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}

ループが終わらない場合は、次の点を確認しましょう。

C#
カウンタ変数は条件式がfalseに近づいているか
i++とi--を間違えていないか
条件式が常にtrueになっていないか

8-3. 配列の範囲外アクセス

配列をfor文で処理するときに多いエラーが、範囲外アクセスです。

C#
int[] numbers = { 10, 20, 30 };

for (int i = 0; i <= numbers.Length; i++)
{
Console.WriteLine(numbers[i]);
}

このコードはエラーになります。

numbers.Lengthは3ですが、使えるインデックスは0、1、2です。i <= numbers.Lengthと書くと、最後にnumbers[3]へアクセスしようとしてしまいます。

正しくは次のように書きます。

C#
int[] numbers = { 10, 20, 30 };

for (int i = 0; i < numbers.Length; i++)
{
Console.WriteLine(numbers[i]);
}

配列やListを処理するときは、基本的に< Lengthまたは< Countを使いましょう。

8-4. 「<」と「<=」の使い分けミス

for文では、<<=の使い分けが重要です。

1から10まで表示したい場合は、次のように<=を使います。

C#
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(i);
}

一方、配列のインデックスを使う場合は、<を使うことが多いです。

C#
string[] names = { "田中", "佐藤", "鈴木" };

for (int i = 0; i < names.Length; i++)
{
Console.WriteLine(names[i]);
}

考え方としては、次のように覚えるとわかりやすいです。

C#
1から10までの数値を表示する  i <= 10
配列の0番目から最後まで処理する i < 配列.Length

8-5. カウンタ変数の増減ミス

for文では、カウンタ変数の増減を間違えると、意図しない結果になります。

C#
for (int i = 0; i < 10; i += 2)
{
Console.WriteLine(i);
}

このコードは、0、2、4、6、8を表示します。

1ずつ増やしたいのにi += 2と書いてしまうと、処理が飛ばされます。

また、逆順に処理したい場合は、初期値、条件式、反復式をセットで考える必要があります。

C#
for (int i = 10; i >= 1; i--)
{
Console.WriteLine(i);
}

逆順ループでは、i--を使い、条件式はi >= 1のように書きます。

8-6. エラーを防ぐための確認ポイント

for文のエラーを防ぐには、次のポイントを確認しましょう。

確認ポイント内容
初期化式カウンタ変数の開始値は正しいか
条件式いつループが終了するか明確か
反復式カウンタ変数が正しい方向に変化しているか
配列アクセスインデックスが範囲外になっていないか
セミコロンforの中の区切りが正しいか
波かっこ繰り返したい処理が{ }の中に入っているか

for文でエラーが出たときは、まず「開始値」「終了条件」「増減」の3つを確認すると原因を見つけやすくなります。

9. C#のfor文を使った実践例

9-1. 九九表を表示する

二重ループを使うと、九九表を作れます。

C#
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= 9; j++)
{
Console.Write($"{i * j}\t");
}

Console.WriteLine();
}

外側のfor文は段を表し、内側のfor文は掛ける数を表します。

C#
i = 1 のとき、1×1 から 1×9 まで計算
i = 2 のとき、2×1 から 2×9 まで計算

Console.Writeは改行せずに表示し、Console.WriteLineは改行します。

9-2. 配列内の最大値・最小値を求める

for文を使って、配列の中から最大値を求めてみましょう。

C#
int[] numbers = { 45, 12, 98, 33, 67 };
int max = numbers[0];

for (int i = 1; i < numbers.Length; i++)
{
if (numbers[i] > max)
{
max = numbers[i];
}
}

Console.WriteLine($"最大値: {max}");

実行結果は次のようになります。

C#
最大値: 98

最小値を求める場合は、比較条件を逆にします。

C#
int[] numbers = { 45, 12, 98, 33, 67 };
int min = numbers[0];

for (int i = 1; i < numbers.Length; i++)
{
if (numbers[i] < min)
{
min = numbers[i];
}
}

Console.WriteLine($"最小値: {min}");

実行結果は次のようになります。

C#
最小値: 12

最初の要素を基準にして、残りの要素と順番に比較するのがポイントです。

9-3. List内の特定条件に合うデータを探す

Listの中から特定の条件に合うデータを探す場合にも、for文が使えます。

C#
List<string> names = new List<string> { "田中", "佐藤", "鈴木", "高橋" };

for (int i = 0; i < names.Count; i++)
{
if (names[i] == "鈴木")
{
Console.WriteLine($"{i}番目に鈴木さんが見つかりました");
break;
}
}

実行結果は次のようになります。

C#
2番目に鈴木さんが見つかりました

見つかった時点でbreakを使えば、それ以降の不要な処理を省けます。

条件に合うデータをすべて表示したい場合は、breakを使わずに処理を続けます。

C#
List<int> scores = new List<int> { 80, 55, 90, 40, 75 };

for (int i = 0; i < scores.Count; i++)
{
if (scores[i] >= 70)
{
Console.WriteLine($"{i}番目の点数は合格です: {scores[i]}");
}
}

9-4. 文字列を1文字ずつ処理する

C#では、文字列もインデックスを使って1文字ずつ取り出せます。

C#
string text = "Hello";

for (int i = 0; i < text.Length; i++)
{
Console.WriteLine(text[i]);
}

実行結果は次のようになります。

C#
H
e
l
l
o

文字列の長さはLengthで取得できます。

C#
text.Length

文字列を逆順に表示することもできます。

C#
string text = "Hello";

for (int i = text.Length - 1; i >= 0; i--)
{
Console.Write(text[i]);
}

実行結果は次のようになります。

C#
olleH

文字列処理でも、配列と同じようにインデックスは0から始まります。

9-5. Unityでも使えるfor文の考え方

C#はUnityのスクリプトでも使われます。Unityでもfor文の考え方は同じです。

たとえば、複数のオブジェクトを生成する処理では、for文がよく使われます。

C#
for (int i = 0; i < 5; i++)
{
Debug.Log($"{i}番目のオブジェクトを生成します");
}

Unityでは、Console.WriteLineの代わりにDebug.Logを使ってログを表示することが多いです。

配列やListに入っているゲームオブジェクトを順番に処理する場合も、for文が使えます。

C#
for (int i = 0; i < enemies.Count; i++)
{
Debug.Log($"{i}番目の敵を処理します");
}

Unityであっても、基本は同じです。

C#
初期化式
条件式
反復式

この3つを理解していれば、UnityのC#スクリプトでもfor文を使えるようになります。

10. for文を理解するための練習問題

10-1. 1から100までの数値を表示する

まずは、1から100までの数値を表示する練習です。

条件は次のとおりです。

C#
開始値: 1
終了値: 100
増え方: 1ずつ

for文の基本を確認するのにぴったりの問題です。

10-2. 偶数だけを表示する

次に、1から100までの中から偶数だけを表示してみましょう。

偶数は、2で割った余りが0になる数です。

C#
i % 2 == 0

この条件をif文で使う方法と、for文の反復式で2ずつ増やす方法があります。

10-3. 配列の中身をすべて表示する

次の配列の中身をすべて表示してみましょう。

C#
int[] numbers = { 5, 10, 15, 20, 25 };

配列の要素数はnumbers.Lengthで取得できます。

インデックスは0から始まるため、条件式はi < numbers.Lengthにします。

10-4. 合計値を求める

次の配列の合計値を求めてみましょう。

C#
int[] scores = { 80, 70, 90, 60 };

合計値を入れる変数を用意して、ループの中で値を足していきます。

C#
int total = 0;

10-5. 解答例と考え方

1から100までの数値を表示する解答例です。

C#
for (int i = 1; i <= 100; i++)
{
Console.WriteLine(i);
}

iを1から始め、100以下の間だけ繰り返します。

偶数だけを表示する解答例です。

C#
for (int i = 1; i <= 100; i++)
{
if (i % 2 == 0)
{
Console.WriteLine(i);
}
}

または、2から始めて2ずつ増やす方法もあります。

C#
for (int i = 2; i <= 100; i += 2)
{
Console.WriteLine(i);
}

配列の中身をすべて表示する解答例です。

C#
int[] numbers = { 5, 10, 15, 20, 25 };

for (int i = 0; i < numbers.Length; i++)
{
Console.WriteLine(numbers[i]);
}

合計値を求める解答例です。

C#
int[] scores = { 80, 70, 90, 60 };
int total = 0;

for (int i = 0; i < scores.Length; i++)
{
total += scores[i];
}

Console.WriteLine($"合計: {total}");

for文の練習では、まず「開始値」「終了条件」「増え方」を意識することが大切です。

11. C#のfor文に関するよくある質問

11-1. for文のiは必ずiでなければいけない?

for文のカウンタ変数は、必ずiでなければいけないわけではありません。

C#
for (int count = 0; count < 5; count++)
{
Console.WriteLine(count);
}

このように、countという名前でも問題ありません。

ただし、プログラミングでは慣習的に、短いループのカウンタ変数にはiがよく使われます。二重ループでは、外側にi、内側にjを使うことが多いです。

C#
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
Console.WriteLine($"i={i}, j={j}");
}
}

11-2. for文の中にfor文を書いてもいい?

for文の中にfor文を書くことはできます。これを二重ループ、またはネストしたfor文と呼びます。

C#
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 3; j++)
{
Console.WriteLine($"{i} × {j} = {i * j}");
}
}

九九表や2次元配列の処理などでよく使われます。

ただし、ネストが深くなりすぎるとコードが読みにくくなるため、必要以上に複雑にしないよう注意しましょう。

11-3. for文とforeach文はどちらを使うべき?

インデックスが必要な場合はfor文、要素を順番に読むだけならforeach文を使うとよいでしょう。

C#
// インデックスが必要な場合
for (int i = 0; i < names.Length; i++)
{
Console.WriteLine($"{i}: {names[i]}");
}
C#
// 要素を読むだけの場合
foreach (string name in names)
{
Console.WriteLine(name);
}

どちらが常に正しいというわけではなく、目的に合わせて選ぶことが大切です。

11-4. for文で無限ループを書くことはできる?

for文でも無限ループを書くことはできます。

C#
for (;;)
{
Console.WriteLine("無限ループです");
}

ただし、このコードは終了条件がないため、そのままでは処理が終わりません。

実際に使う場合は、breakなどで終了できる条件を用意します。

C#
for (;;)
{
string input = Console.ReadLine();

if (input == "exit")
{
break;
}

Console.WriteLine($"入力内容: {input}");
}

無限ループは便利な場面もありますが、初心者のうちは意図せず無限ループを作らないように注意しましょう。

11-5. 配列やListではLengthとCountのどちらを使う?

配列ではLengthを使います。

C#
int[] numbers = { 1, 2, 3 };

for (int i = 0; i < numbers.Length; i++)
{
Console.WriteLine(numbers[i]);
}

ListではCountを使います。

C#
List<int> numbers = new List<int> { 1, 2, 3 };

for (int i = 0; i < numbers.Count; i++)
{
Console.WriteLine(numbers[i]);
}

使い分けは次のように覚えましょう。

種類要素数の取得
配列Length
ListCount
文字列Length

配列と文字列はLength、ListはCountと覚えておくと間違えにくくなります。

まとめ

C#のfor文は、同じ処理を決まった回数だけ繰り返すための基本的な構文です。

基本形は次のとおりです。

C#
for (初期化式; 条件式; 反復式)
{
繰り返したい処理;
}

たとえば、0から4まで表示する場合は次のように書きます。

C#
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}

for文を理解するうえで大切なのは、次の3つです。

要素役割
初期化式ループ開始前に一度だけ実行される
条件式trueの間だけ繰り返す
反復式1回の処理が終わるたびに実行される

また、配列やListを扱うときは、インデックスが0から始まることに注意しましょう。

C#
for (int i = 0; i < array.Length; i++)

for文は、指定回数の繰り返し、配列やListの処理、逆順ループ、合計値の計算、最大値・最小値の検索、二重ループなど、さまざまな場面で使われます。

一方で、全要素を順番に読むだけならforeach文、条件によって繰り返し続けるならwhile文が向いている場合もあります。

for文はC#プログラミングの基礎として非常に重要です。まずは短いサンプルを実際に書きながら、「開始値」「条件式」「増減」の動きを確認していきましょう。