C# while文の使い方を初心者向けに徹底解説|無限ループの原因と安全な書き方もわかる
はじめに
C#で同じ処理を何度も繰り返したいときに使う代表的な構文がwhile文です。英語では「C# while loop」と呼ばれ、条件が成り立っている間だけ処理を繰り返す仕組みです。
たとえば、「数字を1から10まで表示する」「ユーザーが正しい値を入力するまで繰り返す」「特定の条件を満たすまで処理を続ける」といった場面で使われます。
一方で、while文は書き方を間違えると無限ループになり、プログラムが止まらなくなることがあります。特に初心者は、条件式やカウンタ変数の更新を忘れてしまいがちです。
この記事では、C#のwhile文の基本構文から、サンプルコード、breakやcontinueの使い方、無限ループの原因と安全な書き方まで、初心者にもわかりやすく解説します。
1. C#のwhile文とは?初心者向けに基本をわかりやすく解説
1-1. while文は「条件がtrueの間だけ処理を繰り返す」構文
C#のwhile文は、指定した条件がtrueの間、同じ処理を繰り返すための構文です。
基本的なイメージは次のとおりです。
C#while (条件式)
{
繰り返したい処理;
}
条件式がtrueであれば、{ }の中に書かれた処理が実行されます。処理が終わると、もう一度条件式を確認します。そこで再びtrueなら、また処理を実行します。
条件式がfalseになると、while文の繰り返しは終了し、次の処理へ進みます。
1-2. while文が使われる場面とできること
while文は、繰り返す回数が最初からはっきり決まっていない処理でよく使われます。
たとえば、次のような場面です。
C#string input = "";
while (input != "end")
{
Console.WriteLine("文字を入力してください。endで終了します。");
input = Console.ReadLine();
}
この例では、ユーザーがendと入力するまで処理を繰り返します。何回入力されるかは実行してみないとわかりません。このように、条件によって繰り返し回数が変わる処理ではwhile文が便利です。
while文では、次のような処理ができます。
・条件を満たすまで入力を繰り返す
・一定の数値になるまで計算を続ける
・リストや配列を順番に処理する
・特定の状態になるまで処理を監視する
・breakを使って途中でループを終了する
1-3. C#におけるループ処理の基本的な考え方
C#には、繰り返し処理を書くための構文がいくつかあります。
代表的なものは次の3つです。
C#while
for
foreach
whileは、条件が成り立っている間だけ繰り返す構文です。forは、繰り返す回数が決まっているときによく使います。foreachは、配列やリストなどのコレクションを順番に処理するときに便利です。
while文を理解するうえで大切なのは、「いつ始まり、いつ終わるのか」を意識することです。
多くのwhile文では、次の3つをセットで考えます。
C#int count = 1; // 初期化
while (count <= 5) // 条件判定
{
Console.WriteLine(count);
count++; // 更新
}
この「初期化」「条件判定」「更新」の3つが正しく書けていれば、while文は安全に動きます。
1-4. while文は0回実行されることもある
while文は、最初に条件式を判定します。そのため、最初から条件式がfalseの場合、ブロック内の処理は1回も実行されません。
C#int count = 10;
while (count <= 5)
{
Console.WriteLine(count);
count++;
}
このコードでは、countは最初から10です。条件式はcount <= 5なので、最初の判定でfalseになります。
そのため、Console.WriteLine(count);は一度も実行されません。
while文は「条件がtrueの間だけ実行する」構文なので、条件が最初からfalseなら0回実行される、という点を覚えておきましょう。
2. C# while文の基本構文と書き方
2-1. while文の基本構文
C#のwhile文の基本構文は次のとおりです。
C#while (条件式)
{
繰り返したい処理;
}
具体的なコードにすると、次のようになります。
C#int i = 1;
while (i <= 5)
{
Console.WriteLine(i);
i++;
}
このコードは、1から5までの数字を順番に表示します。
処理の流れは次のようになります。
iに1を入れるi <= 5がtrueか確認するtrueなら
iを表示するi++でiを1増やす再び条件式を確認する
iが6になると条件がfalseになり終了する
2-2. 条件式の書き方とtrue/falseの判定
while文の条件式には、結果がbool型、つまりtrueまたはfalseになる式を書きます。
よく使う比較演算子は次のとおりです。
C#== // 等しい
!= // 等しくない
< // より小さい
<= // 以下
> // より大きい
>= // 以上
たとえば、次の条件式はnumberが10未満の間だけtrueになります。
C#while (number < 10)
{
Console.WriteLine(number);
number++;
}
文字列を条件にすることもできます。
C#string input = "";
while (input != "exit")
{
Console.WriteLine("exitと入力すると終了します。");
input = Console.ReadLine();
}
この場合、inputがexitではない間、処理を繰り返します。
2-3. ブロック内に書く処理の流れ
while文の{ }の中には、繰り返したい処理を書きます。
C#int count = 1;
while (count <= 3)
{
Console.WriteLine("現在の値: " + count);
count++;
}
実行結果は次のようになります。
現在の値: 1
現在の値: 2
現在の値: 3
ブロック内の処理は、上から順番に実行されます。最後まで実行されると、再びwhile文の条件式に戻ります。
つまり、while文は次の流れを繰り返します。
条件を確認する
↓
trueなら処理を実行する
↓
処理が終わったら条件に戻る
↓
falseなら終了する
2-4. インクリメント処理を書き忘れないための考え方
while文で数値を使って繰り返す場合、カウンタ変数を更新する処理が重要です。
C#int i = 1;
while (i <= 5)
{
Console.WriteLine(i);
i++;
}
このi++がないと、iはずっと1のままです。
C#int i = 1;
while (i <= 5)
{
Console.WriteLine(i);
}
このコードでは、i <= 5がずっとtrueのままになるため、無限ループになります。
while文を書くときは、次の3つを必ず確認しましょう。
C#int i = 1; // 初期値
while (i <= 5) // 終了条件
{
i++; // 更新処理
}
初期化、条件式、更新処理をセットで考えると、インクリメントの書き忘れを防ぎやすくなります。
2-5. 初心者がまず覚えるべきwhile文の最小コード例
初心者が最初に覚えるべきwhile文の形は、次のコードです。
C#int count = 1;
while (count <= 5)
{
Console.WriteLine(count);
count++;
}
このコードには、while文の基本がすべて含まれています。
C#int count = 1;
ここでカウンタ変数を初期化しています。
C#while (count <= 5)
ここで繰り返しを続ける条件を指定しています。
C#Console.WriteLine(count);
ここで繰り返したい処理を書いています。
C#count++;
ここでカウンタ変数を更新しています。
C#のwhile文を理解するときは、まずこの形をしっかり覚えることが大切です。
3. C# while文のサンプルコードで使い方を理解しよう
3-1. 数字を1から5まで表示する基本例
まずは、1から5までの数字を表示する基本的なwhile文です。
C#int number = 1;
while (number <= 5)
{
Console.WriteLine(number);
number++;
}
実行結果は次のようになります。
1
2
3
4
5
numberは最初に1です。while文の中で表示されたあと、number++によって1ずつ増えていきます。
numberが6になると、条件式number <= 5がfalseになるため、while文は終了します。
3-2. カウントダウンを行うwhile文
while文では、数値を増やすだけでなく、減らしながら繰り返すこともできます。
C#int count = 5;
while (count >= 1)
{
Console.WriteLine(count);
count--;
}
Console.WriteLine("スタート!");
実行結果は次のようになります。
5
4
3
2
1
スタート!
count--は、変数の値を1減らす処理です。
このコードでは、countが1以上の間だけ繰り返します。countが0になると条件がfalseになり、while文が終了します。
3-3. ユーザー入力を条件に繰り返す例
while文は、ユーザー入力を条件にした繰り返し処理にもよく使われます。
C#string input = "";
while (input != "終了")
{
Console.WriteLine("文字を入力してください。終了と入力すると終わります。");
input = Console.ReadLine();
}
Console.WriteLine("プログラムを終了しました。");
このコードでは、ユーザーが終了と入力するまで処理を繰り返します。
実行例は次のようになります。
文字を入力してください。終了と入力すると終わります。
こんにちは
文字を入力してください。終了と入力すると終わります。
テスト
文字を入力してください。終了と入力すると終わります。
終了
プログラムを終了しました。
ユーザーが何回入力するかは事前にわからないため、while文が向いています。
3-4. 条件を満たすまで処理を続ける例
次は、合計が10以上になるまで数値を足し続ける例です。
C#int total = 0;
int number = 1;
while (total < 10)
{
total += number;
Console.WriteLine("現在の合計: " + total);
number++;
}
実行結果は次のようになります。
現在の合計: 1
現在の合計: 3
現在の合計: 6
現在の合計: 10
total < 10がtrueの間だけ処理を繰り返します。totalが10以上になると、while文は終了します。
このように、「ある条件を満たすまで処理を続けたい」という場面ではwhile文が便利です。
3-5. 配列やリストをwhile文で処理する例
配列の中身をwhile文で順番に表示することもできます。
C#string[] fruits = { "りんご", "みかん", "バナナ" };
int index = 0;
while (index < fruits.Length)
{
Console.WriteLine(fruits[index]);
index++;
}
実行結果は次のようになります。
りんご
みかん
バナナ
fruits.Lengthは、配列の要素数を表します。この例では要素数が3なので、indexが0、1、2の間だけ処理を行います。
リストの場合も同じように書けます。
C#List<string> names = new List<string> { "田中", "佐藤", "鈴木" };
int index = 0;
while (index < names.Count)
{
Console.WriteLine(names[index]);
index++;
}
ただし、配列やリストを順番に処理するだけなら、foreach文のほうが読みやすい場合もあります。
4. while文でよく使うbreakとcontinue
4-1. breakでwhile文を途中終了する方法
breakは、while文の繰り返しを途中で終了したいときに使います。
C#int number = 1;
while (number <= 10)
{
if (number == 5)
{
break;
}
Console.WriteLine(number);
number++;
}
実行結果は次のようになります。
1
2
3
4
numberが5になった時点でbreakが実行され、while文が終了します。
breakは、条件式とは別の理由でループを抜けたいときに便利です。
たとえば、ユーザーが特定の文字を入力したら終了する処理にも使えます。
C#while (true)
{
Console.WriteLine("コマンドを入力してください。exitで終了します。");
string command = Console.ReadLine();
if (command == "exit")
{
break;
}
Console.WriteLine("入力されたコマンド: " + command);
}
このように、while (true)とbreakを組み合わせることで、明示的な終了条件を中に書くことができます。
4-2. continueで現在の繰り返しをスキップする方法
continueは、現在の繰り返し処理を途中でスキップし、次の繰り返しへ進むための命令です。
C#int number = 0;
while (number < 5)
{
number++;
if (number == 3)
{
continue;
}
Console.WriteLine(number);
}
実行結果は次のようになります。
1
2
4
5
numberが3のとき、continueが実行されます。そのため、Console.WriteLine(number);は実行されず、次の繰り返しに進みます。
continueを使うと、特定の条件のときだけ処理を飛ばすことができます。
4-3. breakとcontinueの違い
breakとcontinueはどちらもループの流れを変える命令ですが、役割が違います。
breakは、ループそのものを終了します。
C#if (number == 5)
{
break;
}
一方、continueは、現在の1回分の処理だけをスキップして、次の繰り返しに進みます。
C#if (number == 5)
{
continue;
}
違いをまとめると、次のようになります。
break : ループを完全に終了する
continue : 今回の処理だけスキップして次へ進む
たとえば、1から5までの数字を処理するとき、breakを使うと途中で処理が終わります。
C#int i = 1;
while (i <= 5)
{
if (i == 3)
{
break;
}
Console.WriteLine(i);
i++;
}
この場合、表示されるのは1と2だけです。
一方、continueを使うと、特定の値だけ飛ばして処理を続けます。
C#int i = 0;
while (i < 5)
{
i++;
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
この場合、3だけ表示されず、1、2、4、5が表示されます。
4-4. breakやcontinueを使うときの注意点
breakやcontinueは便利ですが、使いすぎると処理の流れがわかりにくくなります。
特にwhile文の中でcontinueを使う場合は、カウンタ変数の更新位置に注意が必要です。
次のコードは危険です。
C#int i = 1;
while (i <= 5)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
i++;
}
このコードでは、iが3になったときにcontinueが実行されます。しかし、i++が実行されないため、iはずっと3のままです。
その結果、無限ループになります。
安全に書くなら、カウンタ変数の更新をcontinueより前に置きます。
C#int i = 0;
while (i < 5)
{
i++;
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
while文でcontinueを使うときは、「更新処理が必ず実行されるか」を確認しましょう。
4-5. 読みやすいループ制御を書くコツ
読みやすいwhile文を書くには、ループを終了する条件やスキップする条件を明確にすることが大切です。
たとえば、次のように条件を整理すると読みやすくなります。
C#int number = 0;
while (number < 10)
{
number++;
bool isEven = number % 2 == 0;
if (!isEven)
{
continue;
}
Console.WriteLine(number);
}
このコードでは、isEvenという変数を使って「偶数かどうか」を表しています。
条件式を直接書くよりも、変数名で意味を表したほうが読みやすい場合があります。
また、breakを使うときは、なぜそこで終了するのかがわかるように書くとよいです。
C#while (true)
{
string input = Console.ReadLine();
if (input == "exit")
{
break;
}
Console.WriteLine(input);
}
終了条件が明確なので、読み手にも処理の意図が伝わりやすくなります。
5. C# while文で無限ループが起きる原因と対処法
5-1. 無限ループとは何か
無限ループとは、ループの終了条件が満たされず、処理が永遠に繰り返される状態のことです。
たとえば、次のコードは無限ループになります。
C#int i = 1;
while (i <= 5)
{
Console.WriteLine(i);
}
iの値が変わらないため、i <= 5がずっとtrueのままです。その結果、1が延々と表示され続けます。
無限ループになると、プログラムが止まらなくなったり、CPUに負荷がかかったりすることがあります。
5-2. 条件式がずっとtrueになるパターン
while文の条件式がずっとtrueになると、ループは終わりません。
C#while (true)
{
Console.WriteLine("繰り返し中");
}
このコードは意図的な無限ループです。while (true)は条件式が常にtrueなので、何もしなければ永遠に繰り返されます。
ただし、while (true)が必ず悪いわけではありません。中にbreakなどの終了処理があれば、実用的に使える場合もあります。
C#while (true)
{
Console.WriteLine("終了するにはexitと入力してください。");
string input = Console.ReadLine();
if (input == "exit")
{
break;
}
}
このコードでは、ユーザーがexitと入力するとbreakでループを抜けます。
5-3. カウンタ変数の更新忘れによる無限ループ
初心者が最もよくやりがちなのが、カウンタ変数の更新忘れです。
C#int count = 1;
while (count <= 10)
{
Console.WriteLine(count);
}
このコードでは、countがずっと1のままです。そのため、条件式count <= 10はずっとtrueになります。
正しくは、while文の中でcount++を書きます。
C#int count = 1;
while (count <= 10)
{
Console.WriteLine(count);
count++;
}
while文では、条件に使っている変数がループの中で変化しているかを必ず確認しましょう。
5-4. 条件式の比較演算子を間違えるケース
比較演算子を間違えることでも、無限ループや想定外の動きが起きます。
たとえば、次のコードを見てください。
C#int i = 1;
while (i >= 1)
{
Console.WriteLine(i);
i++;
}
iは1から始まり、i++で増えていきます。条件式はi >= 1なので、iが増え続けてもずっとtrueです。
本来、1から5まで表示したいなら、次のように書くべきです。
C#int i = 1;
while (i <= 5)
{
Console.WriteLine(i);
i++;
}
比較演算子は、ループの進む方向とセットで考えることが大切です。
増やしていくなら、終了に向かう条件になっているか確認します。
C#i <= 5
減らしていくなら、次のような条件になります。
C#i >= 1
5-5. while(true)を使う場合の注意点
while (true)は、条件式が常にtrueになる書き方です。
C#while (true)
{
// 繰り返す処理
}
この書き方は、明確な終了条件をループの中で判定したい場合に使われます。
C#while (true)
{
Console.WriteLine("数値を入力してください。0で終了します。");
int number = int.Parse(Console.ReadLine());
if (number == 0)
{
break;
}
Console.WriteLine("入力された数値: " + number);
}
ただし、while (true)を使う場合は、必ずどこかに終了条件を書く必要があります。
終了条件がないと、完全な無限ループになります。
C#while (true)
{
Console.WriteLine("終わりません");
}
安全に書くためには、次の点を確認しましょう。
・breakが必ず実行される可能性があるか
・ユーザー入力などで終了できるか
・例外が起きた場合の動きは問題ないか
・ループ内で状態が変化しているか
5-6. 無限ループを止める方法
コンソールアプリで無限ループが起きた場合、多くの開発環境では実行を停止するボタンで止められます。
Visual StudioやVisual Studio Codeでは、デバッグ実行中に停止ボタンを押すことでプログラムを止められます。
コンソール画面で実行している場合は、環境によってはCtrl + Cで停止できることがあります。
ただし、無限ループを止める操作を覚えるよりも、無限ループにならないように書くことのほうが重要です。
開発中は、次のように一時的な上限回数を設けると安全です。
C#int count = 0;
while (true)
{
Console.WriteLine("処理中");
count++;
if (count >= 100)
{
break;
}
}
このようにしておくと、予期しない無限ループを防ぎやすくなります。
5-7. 無限ループを防ぐ安全な書き方
無限ループを防ぐには、while文を書くときに次のポイントを確認します。
まず、終了条件を明確にします。
C#while (count <= 10)
次に、条件に使っている変数がループ内で更新されているか確認します。
C#count++;
そして、breakを使う場合は、どの条件で終了するのかを明確にします。
C#if (input == "exit")
{
break;
}
安全なwhile文の例は次のとおりです。
C#int count = 1;
while (count <= 10)
{
Console.WriteLine(count);
count++;
}
このコードでは、初期値、条件式、更新処理がはっきりしています。
C#int count = 1; // 初期化
count <= 10 // 条件
count++ // 更新
while文を書くときは、この3つがそろっているか確認しましょう。
6. while文とdo while文の違い
6-1. while文は処理前に条件を判定する
while文は、処理を実行する前に条件式を判定します。
C#int number = 10;
while (number < 5)
{
Console.WriteLine(number);
}
このコードでは、number < 5が最初からfalseです。そのため、while文の中の処理は1回も実行されません。
つまり、while文は「条件を確認してから実行する」構文です。
6-2. do while文は最低1回は実行される
do while文は、処理を実行したあとに条件式を判定します。
C#int number = 10;
do
{
Console.WriteLine(number);
}
while (number < 5);
このコードでは、number < 5はfalseです。しかし、do while文は先に処理を実行するため、10が1回表示されます。
do while文の基本構文は次のとおりです。
C#do
{
繰り返したい処理;
}
while (条件式);
while文と違い、最後にセミコロンが必要です。
6-3. while文とdo while文の使い分け
while文とdo while文の違いは、条件判定のタイミングです。
while文 : 処理前に条件を判定する
do while文 : 処理後に条件を判定する
処理を1回も実行しない可能性がある場合は、while文が向いています。
C#while (hasNext)
{
// 条件を満たす間だけ実行
}
一方、最低1回は必ず実行したい場合は、do while文が向いています。
C#do
{
// 最低1回は実行
}
while (条件式);
6-4. 入力チェックではどちらを使うべきか
ユーザー入力のチェックでは、do while文が使いやすい場合があります。
たとえば、「正しい値が入力されるまで繰り返す」という処理では、最初に一度入力を求める必要があります。
C#string input;
do
{
Console.WriteLine("yes または no を入力してください。");
input = Console.ReadLine();
}
while (input != "yes" && input != "no");
このコードでは、最初に必ず入力を求めます。そのあと、入力がyesでもnoでもなければ繰り返します。
while文で書くこともできますが、その場合は初期値を用意する必要があります。
C#string input = "";
while (input != "yes" && input != "no")
{
Console.WriteLine("yes または no を入力してください。");
input = Console.ReadLine();
}
どちらでも書けますが、最低1回入力を求める処理ではdo while文のほうが自然に見えることがあります。
6-5. サンプルコードで違いを比較する
while文とdo while文の違いを、同じ条件で比較してみましょう。
まずはwhile文です。
C#int number = 10;
while (number < 5)
{
Console.WriteLine("while文: " + number);
number++;
}
このコードは、条件が最初からfalseなので何も表示されません。
次にdo while文です。
C#int number = 10;
do
{
Console.WriteLine("do while文: " + number);
number++;
}
while (number < 5);
このコードは、条件がfalseでも最初の1回は実行されます。
実行結果は次のようになります。
do while文: 10
while文は「条件を満たす場合だけ実行したい」とき、do while文は「まず1回実行してから続けるか判断したい」ときに使い分けましょう。
7. while文とfor文・foreach文の違い
7-1. while文とfor文の違い
while文とfor文は、どちらも繰り返し処理を行う構文です。
while文は、条件を中心にして繰り返します。
C#int i = 1;
while (i <= 5)
{
Console.WriteLine(i);
i++;
}
for文は、初期化、条件、更新を1行にまとめて書けます。
C#for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i);
}
この2つは同じ結果になります。
while文は、繰り返し回数が状況によって変わる処理に向いています。for文は、繰り返し回数が決まっている処理に向いています。
7-2. while文とforeach文の違い
foreach文は、配列やリストなどの要素を順番に取り出して処理するための構文です。
C#string[] fruits = { "りんご", "みかん", "バナナ" };
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
同じ処理をwhile文で書くと、次のようになります。
C#string[] fruits = { "りんご", "みかん", "バナナ" };
int index = 0;
while (index < fruits.Length)
{
Console.WriteLine(fruits[index]);
index++;
}
foreach文のほうが、インデックスや更新処理を書かなくてよいため、シンプルです。
配列やリストの要素を最初から最後まで順番に処理するだけなら、foreach文を使うと読みやすくなります。
7-3. 回数が決まっている処理はfor文が向いている
「10回繰り返す」「1から100まで処理する」のように、繰り返し回数が決まっている場合はfor文が向いています。
C#for (int i = 1; i <= 10; i++)
{
Console.WriteLine(i);
}
もちろんwhile文でも書けます。
C#int i = 1;
while (i <= 10)
{
Console.WriteLine(i);
i++;
}
ただし、for文では初期化、条件、更新が1行にまとまっているため、回数が決まっている処理では見通しがよくなります。
7-4. 条件次第で繰り返す処理はwhile文が向いている
一方で、繰り返し回数が決まっていない処理ではwhile文が向いています。
たとえば、ユーザーがexitと入力するまで繰り返す処理です。
C#string input = "";
while (input != "exit")
{
Console.WriteLine("入力してください。exitで終了します。");
input = Console.ReadLine();
}
この処理は、ユーザーが何回入力するか事前にわかりません。
このように、「条件を満たすまで続ける」「特定の状態になるまで待つ」といった処理ではwhile文が自然です。
7-5. 配列やコレクション処理ではforeach文も検討する
配列やリストを処理するときは、while文だけでなくforeach文も検討しましょう。
C#List<string> names = new List<string> { "田中", "佐藤", "鈴木" };
foreach (string name in names)
{
Console.WriteLine(name);
}
このコードは、リスト内の要素を順番に表示します。
while文で書くよりも簡潔です。
C#int index = 0;
while (index < names.Count)
{
Console.WriteLine(names[index]);
index++;
}
ただし、インデックス番号を使いたい場合や、途中で特定の位置にアクセスしたい場合は、while文やfor文が便利です。
目的に応じて、while、for、foreachを使い分けることが大切です。
8. 初心者がwhile文でつまずきやすいポイント
8-1. 条件式の意味が理解できない
while文で最初につまずきやすいのが、条件式の意味です。
C#while (count <= 5)
この条件式は、「countが5以下の間、繰り返す」という意味です。
「5になったら終わる」と勘違いしやすいですが、<=は「以下」なので、countが5のときも処理は実行されます。
C#int count = 1;
while (count <= 5)
{
Console.WriteLine(count);
count++;
}
このコードでは、1, 2, 3, 4, 5が表示されます。
条件式を読むときは、「この条件がtrueの間は続く」と考えるのがポイントです。
8-2. カウンタ変数の初期化位置を間違える
カウンタ変数の初期化位置を間違えると、想定どおりに動かないことがあります。
たとえば、次のコードはよくない例です。
C#while (true)
{
int count = 1;
Console.WriteLine(count);
count++;
if (count > 5)
{
break;
}
}
このコードでは、ループのたびにcountが1に戻ってしまいます。そのため、count > 5になることがなく、無限ループになります。
正しくは、カウンタ変数をwhile文の外で初期化します。
C#int count = 1;
while (true)
{
Console.WriteLine(count);
count++;
if (count > 5)
{
break;
}
}
カウンタ変数は、基本的にループの外で初期化しましょう。
8-3. 変数の更新タイミングを間違える
変数を更新するタイミングによって、表示される値や処理回数が変わります。
C#int count = 1;
while (count <= 5)
{
Console.WriteLine(count);
count++;
}
このコードは、1から5まで表示します。
しかし、更新を先に書くと結果が変わります。
C#int count = 1;
while (count <= 5)
{
count++;
Console.WriteLine(count);
}
この場合、表示されるのは2から6です。
どちらが正しいかは目的によりますが、初心者のうちは「処理してから更新する」形を基本にすると理解しやすいです。
C#Console.WriteLine(count);
count++;
8-4. セミコロンの位置を間違える
while文の直後にセミコロンを書いてしまうと、意図しない動きになります。
間違った例です。
C#int count = 1;
while (count <= 5);
{
Console.WriteLine(count);
count++;
}
while (count <= 5);のセミコロンによって、while文の中身が空になります。
その結果、countが更新されず、無限ループになる可能性があります。
正しくは、while文の条件式の後にセミコロンを書きません。
C#int count = 1;
while (count <= 5)
{
Console.WriteLine(count);
count++;
}
ただし、do while文では最後にセミコロンが必要です。
C#do
{
Console.WriteLine(count);
count++;
}
while (count <= 5);
while文とdo while文でセミコロンの位置が違う点に注意しましょう。
8-5. ネストしたwhile文で処理の流れがわからなくなる
while文の中にwhile文を書くことを、ネストと呼びます。
C#int i = 1;
while (i <= 3)
{
int j = 1;
while (j <= 3)
{
Console.WriteLine("i=" + i + ", j=" + j);
j++;
}
i++;
}
実行結果は次のようになります。
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
外側のwhile文が1回動くたびに、内側のwhile文が最初から最後まで実行されます。
ネストしたwhile文は処理が複雑になりやすいため、初心者のうちは変数名をわかりやすくし、インデントをそろえることが大切です。
8-6. デバッグでループの動きを確認する方法
while文の動きがわからないときは、変数の値を表示して確認すると理解しやすくなります。
C#int count = 1;
while (count <= 5)
{
Console.WriteLine("ループ開始 count = " + count);
Console.WriteLine(count);
count++;
Console.WriteLine("ループ終了 count = " + count);
}
このように、ループの開始時と終了時に値を表示すると、変数がどのように変化しているかがわかります。
また、Visual Studioなどの開発環境では、ブレークポイントを設定して1行ずつ実行できます。
デバッグするときは、次の点を確認しましょう。
・条件式がtrueかfalseか
・カウンタ変数が更新されているか
・breakやcontinueが実行されているか
・想定より多く繰り返していないか
while文がうまく動かないときは、まず変数の値を確認するのが効果的です。
9. C# while文を安全に書くためのベストプラクティス
9-1. ループ終了条件を明確にする
while文では、終了条件を明確にすることが重要です。
悪い例です。
C#while (true)
{
DoSomething();
}
このコードだけでは、いつ終了するのかわかりません。
終了条件を明確にすると、読みやすく安全になります。
C#int count = 0;
while (count < 10)
{
DoSomething();
count++;
}
また、while (true)を使う場合でも、必ず終了条件を書きます。
C#while (true)
{
string input = Console.ReadLine();
if (input == "exit")
{
break;
}
}
ループは「どの条件で終わるのか」を最初に考えてから書きましょう。
9-2. 変数の初期化・判定・更新をセットで考える
while文では、初期化、判定、更新をセットで考えると安全です。
C#int i = 0; // 初期化
while (i < 10) // 判定
{
Console.WriteLine(i);
i++; // 更新
}
この3つのうち1つでも抜けると、意図しない動きになる可能性があります。
特に更新処理を忘れると、無限ループになりやすいです。
C#int i = 0;
while (i < 10)
{
Console.WriteLine(i);
// i++ がない
}
while文を書いたら、必ず次の3点を確認しましょう。
初期化されているか
条件式は正しいか
更新されているか
9-3. while(true)には必ず終了条件を書く
while (true)は、明示的に無限ループを作る書き方です。
そのため、必ずbreakなどの終了条件が必要です。
C#while (true)
{
Console.WriteLine("コマンドを入力してください。");
string command = Console.ReadLine();
if (command == "exit")
{
break;
}
Console.WriteLine("実行: " + command);
}
このコードでは、exitが入力されると終了します。
終了条件が複数ある場合もあります。
C#int count = 0;
while (true)
{
count++;
if (count > 100)
{
break;
}
Console.WriteLine(count);
}
while (true)を書くときは、「どの条件でbreakするのか」を必ずセットで書きましょう。
9-4. 複雑な条件式は変数やメソッドに分ける
条件式が長くなると、while文が読みにくくなります。
C#while (age >= 20 && hasTicket == true && isMember == true && isActive == true)
{
Console.WriteLine("入場できます");
break;
}
このような場合は、条件を変数に分けると読みやすくなります。
C#bool canEnter = age >= 20 && hasTicket && isMember && isActive;
while (canEnter)
{
Console.WriteLine("入場できます");
break;
}
さらに、処理が複雑な場合はメソッドに分けることもできます。
C#while (CanEnter(age, hasTicket, isMember, isActive))
{
Console.WriteLine("入場できます");
break;
}
static bool CanEnter(int age, bool hasTicket, bool isMember, bool isActive)
{
return age >= 20 && hasTicket && isMember && isActive;
}
条件式は、正しく動くだけでなく、読んだ人が意味を理解できることも大切です。
9-5. 長すぎるwhile文は処理を分割する
while文の中に処理を詰め込みすぎると、何をしているのかわかりにくくなります。
C#while (condition)
{
// 入力処理
// チェック処理
// 計算処理
// 表示処理
// 保存処理
}
このような場合は、処理をメソッドに分けると読みやすくなります。
C#while (condition)
{
string input = ReadInput();
if (!IsValid(input))
{
continue;
}
int result = Calculate(input);
ShowResult(result);
}
処理の目的ごとに分けることで、while文全体の流れがわかりやすくなります。
長いwhile文を書いていると感じたら、「別のメソッドに切り出せないか」を考えてみましょう。
9-6. コメントでループの目的を明確にする
while文の目的がわかりにくい場合は、コメントを書くと読みやすくなります。
C#// ユーザーがexitと入力するまでコマンドを受け付ける
while (true)
{
string command = Console.ReadLine();
if (command == "exit")
{
break;
}
ExecuteCommand(command);
}
コメントは、コードをそのまま説明するのではなく、「なぜその処理をしているのか」を書くと効果的です。
悪いコメントの例です。
C#// countを1増やす
count++;
このコメントはコードを見ればわかります。
よいコメントの例です。
C#// 最大10回まで再試行する
while (retryCount < 10)
{
retryCount++;
}
while文では、ループの目的や終了条件をコメントで補足すると、あとから見直したときにも理解しやすくなります。
10. C# while文の実践練習問題
10-1. 1から10まで表示する練習
まずは、1から10までの数字を表示するwhile文を書いてみましょう。
C#int number = 1;
while (number <= 10)
{
Console.WriteLine(number);
number++;
}
実行結果は次のようになります。
1
2
3
4
5
6
7
8
9
10
この練習では、初期化、条件式、更新処理の基本を確認できます。
C#int number = 1; // 初期化
number <= 10 // 条件式
number++ // 更新
while文の基本形として何度も練習しておきましょう。
10-2. 偶数だけを表示する練習
次は、1から10までのうち偶数だけを表示する練習です。
C#int number = 1;
while (number <= 10)
{
if (number % 2 == 0)
{
Console.WriteLine(number);
}
number++;
}
実行結果は次のようになります。
2
4
6
8
10
number % 2 == 0は、numberを2で割った余りが0かどうかを判定しています。余りが0なら偶数です。
別の書き方として、最初から2ずつ増やす方法もあります。
C#int number = 2;
while (number <= 10)
{
Console.WriteLine(number);
number += 2;
}
このコードでも、偶数だけを表示できます。
10-3. 合計値を求める練習
1から10までの合計を求めるwhile文を書いてみましょう。
C#int number = 1;
int total = 0;
while (number <= 10)
{
total += number;
number++;
}
Console.WriteLine("合計: " + total);
実行結果は次のようになります。
合計: 55
total += number;は、total = total + number;と同じ意味です。
ループの中で値を足し続けることで、合計を求められます。
このような合計処理は、while文の練習にとても向いています。
10-4. 入力された文字が条件を満たすまで繰り返す練習
ユーザーが正しい文字を入力するまで繰り返す処理を書いてみましょう。
C#string input = "";
while (input != "yes" && input != "no")
{
Console.WriteLine("yes または no を入力してください。");
input = Console.ReadLine();
}
Console.WriteLine("入力された値: " + input);
このコードでは、入力がyesでもnoでもない場合、再入力を求めます。
実行例は次のようになります。
yes または no を入力してください。
abc
yes または no を入力してください。
test
yes または no を入力してください。
yes
入力された値: yes
ユーザー入力は何回行われるかわからないため、while文が適しています。
10-5. 無限ループを修正する練習
次のコードは無限ループになります。
C#int count = 1;
while (count <= 5)
{
Console.WriteLine(count);
}
原因は、countを更新していないことです。
修正後のコードは次のようになります。
C#int count = 1;
while (count <= 5)
{
Console.WriteLine(count);
count++;
}
もう1つ例を見てみましょう。
C#int count = 5;
while (count >= 1)
{
Console.WriteLine(count);
count++;
}
このコードも無限ループになります。countが増え続けるため、count >= 1がずっとtrueになるからです。
カウントダウンしたい場合は、count--を使います。
C#int count = 5;
while (count >= 1)
{
Console.WriteLine(count);
count--;
}
無限ループを修正するときは、条件式と変数の更新方向が合っているか確認しましょう。
11. C# while文に関するよくある質問
11-1. while文はいつ使えばいいですか?
while文は、繰り返し回数が事前に決まっていない処理で使うと便利です。
たとえば、次のような場合です。
・ユーザーが特定の文字を入力するまで繰り返す
・条件を満たすまで計算を続ける
・データが存在する間だけ処理する
・状態が変わるまで処理を続ける
例として、ユーザーがexitと入力するまで繰り返す処理があります。
C#string input = "";
while (input != "exit")
{
Console.WriteLine("入力してください。exitで終了します。");
input = Console.ReadLine();
}
回数よりも条件が重要な処理では、while文を使うと自然に書けます。
11-2. while文とfor文はどちらを使うべきですか?
繰り返し回数が決まっている場合はfor文、条件次第で繰り返す場合はwhile文を使うとよいです。
10回繰り返す場合は、for文が向いています。
C#for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}
ユーザー入力によって終了する場合は、while文が向いています。
C#string input = "";
while (input != "exit")
{
input = Console.ReadLine();
}
ただし、どちらでも書ける場面は多くあります。大切なのは、読んだ人が処理の流れを理解しやすい書き方を選ぶことです。
11-3. while文が1回も実行されないのはなぜですか?
while文は、処理を実行する前に条件式を判定します。
そのため、最初から条件式がfalseの場合、処理は1回も実行されません。
C#int count = 10;
while (count <= 5)
{
Console.WriteLine(count);
count++;
}
このコードでは、count <= 5が最初からfalseです。
while文を1回も実行したくない場合には問題ありませんが、最低1回は実行したい場合はdo while文を検討しましょう。
C#do
{
Console.WriteLine(count);
}
while (count <= 5);
do while文なら、条件に関係なく最初の1回は実行されます。
11-4. while(true)は使っても問題ありませんか?
while (true)は使っても問題ありません。ただし、必ず終了条件を書く必要があります。
安全な例です。
C#while (true)
{
Console.WriteLine("exitで終了します。");
string input = Console.ReadLine();
if (input == "exit")
{
break;
}
}
このコードでは、exitが入力されるとbreakでループを抜けます。
危険な例です。
C#while (true)
{
Console.WriteLine("終わりません");
}
このコードには終了条件がないため、無限ループになります。
while (true)を使うときは、「どこで終わるのか」がすぐにわかるように書くことが大切です。
11-5. 無限ループになったらどうすればいいですか?
無限ループになったら、まずプログラムの実行を停止します。開発環境の停止ボタンや、コンソールでのCtrl + Cなどを使って止めます。
そのあと、次の点を確認しましょう。
・条件式がずっとtrueになっていないか
・カウンタ変数を更新しているか
・更新方向が条件式と合っているか
・continueによって更新処理が飛ばされていないか
・while(true)にbreakがあるか
たとえば、次のコードは無限ループです。
C#int i = 1;
while (i <= 5)
{
Console.WriteLine(i);
}
修正するには、i++を追加します。
C#int i = 1;
while (i <= 5)
{
Console.WriteLine(i);
i++;
}
無限ループの多くは、条件式と変数の更新を見直すことで解決できます。
11-6. while文の中でreturnを使ってもいいですか?
while文の中でreturnを使うことはできます。
returnは、メソッドの処理を終了して呼び出し元に戻る命令です。while文の中でreturnが実行されると、ループだけでなくメソッド全体が終了します。
C#static void CheckNumber()
{
int number = 1;
while (number <= 10)
{
if (number == 5)
{
return;
}
Console.WriteLine(number);
number++;
}
Console.WriteLine("終了しました");
}
このコードでは、numberが5になった時点でreturnが実行されます。そのため、メソッド全体が終了し、終了しましたは表示されません。
while文だけを抜けたい場合はbreakを使います。
C#while (number <= 10)
{
if (number == 5)
{
break;
}
Console.WriteLine(number);
number++;
}
returnはメソッド全体を終了する、breakはループだけを終了する、と覚えておきましょう。
まとめ
C#のwhile文は、条件がtrueの間だけ処理を繰り返すための基本的な構文です。英語では「C# while loop」と呼ばれ、繰り返し処理を学ぶうえで欠かせない内容です。
while文の基本形は次のとおりです。
C#while (条件式)
{
繰り返したい処理;
}
数値を使った基本的なwhile文では、初期化、条件式、更新処理をセットで考えることが大切です。
C#int count = 1;
while (count <= 5)
{
Console.WriteLine(count);
count++;
}
while文は、ユーザー入力を繰り返す処理や、条件を満たすまで続ける処理に向いています。一方で、カウンタ変数の更新忘れや条件式の間違いによって、無限ループが起きることがあります。
無限ループを防ぐには、次の点を意識しましょう。
・終了条件を明確にする
・条件に使う変数を正しく更新する
・比較演算子を間違えない
・while(true)には必ずbreakなどの終了処理を書く
・continueを使う場合は更新処理が飛ばされないようにする
また、while文とfor文、foreach文、do while文にはそれぞれ向いている場面があります。
繰り返し回数が決まっているならfor文、配列やリストを順番に処理するならforeach文、最低1回は実行したいならdo while文、条件次第で繰り返したいならwhile文が使いやすいです。
while文は初心者がつまずきやすい構文ですが、基本の流れを理解すれば難しくありません。まずは、1から5まで表示するようなシンプルなコードから練習し、条件式や変数の更新に慣れていきましょう。

