C#でプログラムを記述する際、同じ処理を何度も繰り返したい場面は頻繁に登場します。
一般的にはfor文やwhile文が多用されますが、特定のシチュエーションにおいて非常に強力な力を発揮するのがdo-while文です。
この構文の最大の特徴は、条件判定を処理の後に行うという点にあります。
本記事では、初心者の方でも確実にマスターできるよう、while文との決定的な違いや具体的な活用シーン、注意すべきポイントまでを徹底的に解説していきます。
C#における繰り返し処理とdo-while文の役割
C#の繰り返し構文の中で、do-while文は「後判定ループ」と呼ばれます。
通常のwhile文やfor文が「条件を満たしていなければ一度も実行されない」可能性があるのに対し、do-while文は必ず最低一回は処理が実行されることが保証されています。
これは、例えばユーザーに対して入力を促し、その内容が正しいかどうかを後から判定するような「まず動かしてみる」ことが必要な処理に最適です。
do-while文の基本構文
まずはdo-while文の書き方を確認しましょう。
構造は非常にシンプルですが、最後に;(セミコロン)が必要になる点に注意が必要です。

do
{
// ここに繰り返したい処理を記述します
// このブロック内のコードは、条件に関わらず最初に必ず1回実行されます
} while (継続条件); // 条件がtrueの間、doのブロックに戻って繰り返します
この構文では、まずdoに続く中括弧{}内の処理が実行されます。
その処理が終わった後にwhileの括弧内にある条件式が評価されます。
もし条件がtrueであれば再びdoの先頭に戻り、falseであればループを抜けて次の処理へ進みます。
do-while文の処理フローを理解する
プログラムがどのように動くのかをフローチャートのイメージで理解しておくと、バグの少ないコードが書けるようになります。
do-while文の最大の特徴である「後判定」の流れを整理しましょう。

通常のwhile文は、入り口に門番(条件判定)が立っているイメージですが、do-while文は出口に門番が立っているイメージです。
一度中に入って用事を済ませてから、次も入って良いかどうかを確認されるというわけです。
do-while文とwhile文の決定的な違い
C#を学習し始めたばかりの頃、多くの人が「while文だけで十分ではないか」という疑問を抱きます。
しかし、両者には明確な挙動の違いがあります。
ここでは、条件が最初から偽(false)であった場合にどのような差が出るのかを比較してみましょう。
実行タイミングによる比較
以下の表は、両者の主な違いをまとめたものです。
| 項目 | while文 (前判定) | do-while文 (後判定) |
|---|---|---|
| 判定タイミング | 処理の実行前 | 処理の実行後 |
| 最低実行回数 | 0回 (一度も実行されない場合がある) | 1回 (必ず一度は実行される) |
| 主な用途 | 条件を満たす間だけ動かしたいとき | 処理の結果を見て継続を判断したいとき |
| 構文末尾のセミコロン | 不要 | 必要 |
具体的なコードでの比較
実際に、条件が最初から満たされていない場合の挙動をコードで見てみましょう。
using System;
class Program
{
static void Main()
{
int count = 10;
// while文の場合
Console.WriteLine("--- while文の開始 ---");
while (count < 5)
{
// countは10なので、10 < 5 は false。一度も実行されません。
Console.WriteLine("whileループ内を実行中");
}
Console.WriteLine("--- while文の終了 ---");
// do-while文の場合
Console.WriteLine("\n--- do-while文の開始 ---");
do
{
// 条件判定が後なので、まずこの処理が実行されます。
Console.WriteLine("do-whileループ内を実行中");
} while (count < 5); // 実行後に判定され、falseなのでループを抜けます
Console.WriteLine("--- do-while文の終了 ---");
}
}
--- while文の開始 ---
--- while文の終了 ---
--- do-while文の開始 ---
do-whileループ内を実行中
--- do-while文の終了 ---
このように、同じ条件式count < 5を使用していても、do-while文の方は必ず1回はメッセージが表示されることがわかります。
これが「後判定」の最大の特徴です。
do-while文の具体的な使い方とサンプルコード
理論だけでなく、実際の開発現場でdo-while文がどのように使われるのか、具体的なケーススタディを見ていきましょう。
1. ユーザー入力のバリデーション(妥当性確認)
最も一般的な活用例は、ユーザーに何かを入力してもらい、その内容が正しくなければ再入力を促すというパターンです。
この場合、「少なくとも1回は入力してもらう必要がある」ため、do-while文が最適です。

using System;
class Program
{
static void Main()
{
int number;
bool isValid;
do
{
Console.Write("1から10の間の数字を入力してください: ");
string input = Console.ReadLine();
// 数値に変換できるか、かつ1〜10の範囲内かをチェック
isValid = int.TryParse(input, out number) && number >= 1 && number <= 10;
if (!isValid)
{
Console.WriteLine("入力が正しくありません。再試行してください。");
}
} while (!isValid); // 正しい入力が得られるまで繰り返す
Console.WriteLine($"あなたが入力した数字は {number} です。");
}
}
このプログラムでは、まずユーザーに入力を求め、その結果を判定しています。
正しくない入力(数値以外や範囲外の数値)があった場合にのみ、再度ループの先頭に戻って入力を促します。
2. メニュー選択システム
コンソールアプリケーションなどで、特定のキーが押されるまでプログラムを継続させるメニュー画面にもdo-while文がよく使われます。
using System;
class Program
{
static void Main()
{
string choice;
do
{
Console.WriteLine("\n--- メニュー ---");
Console.WriteLine("1: こんにちはと挨拶する");
Console.WriteLine("2: 現在時刻を表示する");
Console.WriteLine("Q: 終了する");
Console.Write("選択してください: ");
choice = Console.ReadLine().ToUpper(); // 入力を大文字に変換
switch (choice)
{
case "1":
Console.WriteLine("こんにちは!C#の世界へようこそ。");
break;
case "2":
Console.WriteLine($"現在の時刻は {DateTime.Now} です。");
break;
case "Q":
Console.WriteLine("プログラムを終了します。");
break;
default:
Console.WriteLine("無効な選択です。");
break;
}
} while (choice != "Q"); // "Q"が入力されない限り繰り返す
}
}
この例では、最初に必ずメニューを表示し、ユーザーが「Q」を選択して終了の意思を示すまで、何度でも処理を繰り返すことができます。
break文とcontinue文による制御
do-while文のループ内では、他の繰り返し構文と同様にbreak文とcontinue文を使用して流れを制御することができます。
break文でループを強制終了する
特定の条件が発生した際に、whileの判定を待たずにループを抜け出したい場合はbreakを使用します。
int i = 0;
do
{
if (i == 5)
{
break; // iが5になったら、直ちにループを抜ける
}
Console.WriteLine(i);
i++;
} while (i < 10);
continue文で次の回へスキップする
現在の回の処理を中断し、すぐにwhileの条件判定へ進みたい場合はcontinueを使用します。
int i = 0;
do
{
i++;
if (i % 2 == 0)
{
continue; // 偶数の場合は、これ以降の処理を飛ばして条件判定へ
}
Console.WriteLine($"奇数: {i}");
} while (i < 10);
do-while文を使用する際の注意点とベストプラクティス
非常に便利なdo-while文ですが、使用する際にはいくつか気を付けるべき落とし穴があります。
無限ループに注意
条件式が常にtrueのままだと、プログラムは永遠に停止しません。
これを無限ループと呼びます。

無限ループを避けるためには、必ずループ内で条件式に影響を与える変数の値を更新するか、特定の条件でbreakを呼び出すように設計する必要があります。
セミコロンの付け忘れ
C#において、for文やwhile文の末尾にはセミコロンを付けません。
しかし、do-while文だけはwhile(条件);という形式で最後にセミコロンが必要です。
// 誤った例
do {
// 処理
} while (i < 10) // ここでコンパイルエラー!
// 正しい例
do {
// 処理
} while (i < 10); // セミコロンが必要
これは文法上のルールであり、忘れると「; が必要です」というエラーメッセージが表示されます。
初心者が最もハマりやすいポイントの一つですので、しっかり覚えておきましょう。
変数のスコープ(有効範囲)
doブロック内で宣言した変数は、whileの条件式の中では使用できません。
これは、変数のスコープがそのブロック{}内に限定されるためです。
// 誤った例
do {
int x = int.Parse(Console.ReadLine());
} while (x < 10); // エラー:変数 'x' は現在のコンテキストに存在しません
条件式で変数を使いたい場合は、必ずdoブロックの外側で変数を宣言しておく必要があります。
// 正しい例
int x;
do {
x = int.Parse(Console.ReadLine());
} while (x < 10); // OK
まとめ
C#のdo-while文は、「まず一度やってみて、その結果で続けるか決める」というロジックを簡潔に表現できる非常に便利なツールです。
今回のポイントを振り返ってみましょう。
- 後判定ループであるため、最低でも必ず1回は処理が実行される。
while文は「実行前に判定」、do-while文は「実行後に判定」という違いがある。- ユーザー入力の受け付けや、リトライ処理、メニュー画面のループに最適。
- 構文の最後には必ずセミコロン(;)を付ける。
- 条件式で使う変数は、ループの外側で宣言する。
適切な場面でdo-while文を選択することで、コードの可読性は向上し、論理的なミスも減らすことができます。
while文との使い分けを意識して、より洗練されたC#プログラミングを目指しましょう。
