プログラミングにおいて、特定の処理を繰り返し実行する「ループ処理」は欠かせない要素です。
C#にはいくつかのループ構文が用意されていますが、その中でも「最低でも必ず1回は処理を実行したい」という場面で非常に重宝するのがdo-while文です。
本記事では、初心者の方でも迷わず使いこなせるよう、do-while文の基本構文から、一般的なwhile文との決定的な違い、そして実戦で役立つ具体的な活用シーンまで、図解を交えて徹底的に解説します。
do-while文の基本構造と動作の流れ
C#のdo-while文は、処理を実行した後に継続条件を判定する「後判定ループ」と呼ばれる制御構文です。
まずはその基本的な書き方と、プログラムがどのような順番で動くのかを視覚的に理解しましょう。

基本構文の書き方
do-while文は、以下のような構文で記述します。
do
{
// 繰り返し実行したい処理
// ここに記述されたコードは、条件に関わらず最初に一度だけ必ず実行されます
} while (条件式); // 最後にセミコロンが必要
最も注意すべき点は、末尾の「while (条件式)」の後に必ずセミコロン「;」が必要であるということです。
通常のwhile文やif文にはセミコロンが不要なため、初心者が最も間違いやすいポイントの一つです。
基本的なサンプルコード
まずは、数値を1から3までカウントアップして表示するシンプルなプログラムを見てみましょう。
using System;
class Program
{
static void Main()
{
int count = 1;
// do-while文の開始
do
{
Console.WriteLine($"現在のカウントは {count} です。");
count++; // カウントを1増やす
} while (count <= 3); // countが3以下の間、繰り返す
Console.WriteLine("ループが終了しました。");
}
}
現在のカウントは 1 です。
現在のカウントは 2 です。
現在のカウントは 3 です。
ループが終了しました。
このコードでは、まずcountが1の状態でdoブロック内の処理が実行されます。
その後、while (count <= 3)によって継続判定が行われ、条件を満たしている間は再びdoの先頭に戻ります。
while文とdo-while文の決定的な違い
C#には、もう一つの代表的なループ構文としてwhile文が存在します。
どちらも「条件が満たされている間繰り返す」という点は共通していますが、「いつ条件を判定するか」というタイミングが異なります。

前判定(while)と後判定(do-while)
while文は「前判定」です。
処理を行う前に条件をチェックするため、最初から条件が偽(False)であれば、処理は一度も実行されません。
対して、do-while文は「後判定」です。
処理を行った後に条件をチェックするため、たとえ最初から条件が偽であっても、必ず1回は処理が実行されます。
比較コードによる動作の確認
以下のサンプルコードで、最初から条件を満たしていない場合の挙動の違いを確認してみましょう。
using System;
class Program
{
static void Main()
{
int value = 100;
Console.WriteLine("--- while文の場合 ---");
// 条件が最初からFalse (100 < 10)
while (value < 10)
{
Console.WriteLine("この行は実行されません。");
}
Console.WriteLine("--- do-while文の場合 ---");
// 条件が最初からFalse (100 < 10) だが、一度は実行される
do
{
Console.WriteLine("この行は一度だけ実行されます。");
} while (value < 10);
}
}
--- while文の場合 ---
--- do-while文の場合 ---
この行は一度だけ実行されます。
どちらを使うべきかの判断基準
以下の表は、それぞれのループの使い分けをまとめたものです。
| 特徴 | while文 | do-while文 |
|---|---|---|
| 判定タイミング | 処理の前(前判定) | 処理の後(後判定) |
| 最低実行回数 | 0回 | 1回 |
| 主な用途 | 条件によって実行自体をスキップしたい時 | ユーザー入力や初期化など、必ず一度は動かしたい時 |
| 構文の末尾 | セミコロン不要 | セミコロンが必要 |
基本的にはwhile文の方が汎用性が高く、使用頻度も高いですが、「まずやってみて、その結果を見てから続けるか決める」というロジックにはdo-while文が最適です。
実戦での活用シーン:ユーザー入力のバリデーション
do-while文が最も輝く場面の一つが、「正しい値が入力されるまで入力を促し続ける」というユーザーインターフェースの実装です。

数値入力チェックのサンプルコード
例えば、ユーザーに正の数を入力してもらい、負の数が入力された場合は再度入力を求めるプログラムを考えてみます。
using System;
class Program
{
static void Main()
{
int inputNumber;
// 正しい入力が得られるまで繰り返す
do
{
Console.Write("正の整数を入力してください(0より大きい値): ");
string input = Console.ReadLine();
// 数値に変換できるか、かつ0より大きいかチェック
if (!int.TryParse(input, out inputNumber) || inputNumber <= 0)
{
Console.WriteLine("エラー:無効な入力です。もう一度入力してください。");
inputNumber = -1; // ループを継続させるためのフラグ設定
}
} while (inputNumber <= 0); // 条件を満たさない間はループ
Console.WriteLine($"ありがとうございます。入力された値は {inputNumber} です。");
}
}
このプログラムでは、ユーザーは最低でも一度は入力を求められます。
もし不適切な値が入力された場合のみ、whileの条件式によってループが継続される仕組みです。
これを通常のwhile文で書こうとすると、ループの外で一度入力を受け取り、さらにループ内でも入力を受け取るという、コードの重複が発生しやすくなります。
do-while文を使うことで、「入力」というアクションを1箇所に集約でき、非常にスッキリとしたコードになります。
ループを制御するbreak文とcontinue文
do-while文の中でも、他のループ文と同様にbreak文とcontinue文を使って、繰り返し処理の流れを細かく制御することができます。
break文による強制終了
break文を使用すると、条件式の判定を待たずに、その場でループを完全に脱出します。
int i = 0;
do
{
if (i == 5)
{
Console.WriteLine("5に達したので中断します。");
break; // ループを抜ける
}
Console.WriteLine(i);
i++;
} while (i < 10);
continue文による処理のスキップ
continue文を使用すると、それ以降の処理を飛ばして、すぐに条件判定(whileの部分)へジャンプします。
int i = 0;
do
{
i++;
if (i % 2 == 0)
{
continue; // 偶数の場合は、これ以降のWriteLineをスキップして条件判定へ
}
Console.WriteLine($"奇数: {i}");
} while (i < 5);
奇数: 1
奇数: 3
奇数: 5
注意点として、do-while文でcontinueを使う場合、変数の更新(i++など)をcontinueより前で行っておかないと、無限ループに陥る危険性があります。
do-while文を使用する際の注意点とTips
便利で見通しの良いdo-while文ですが、特有の注意点や、知っておくと便利なテクニックがあります。
無限ループに注意する
do-while文は条件がtrueである限り永遠に繰り返されます。
意図的に無限ループを作る場合もありますが、通常はループ内で条件が変化するように設計しなければなりません。
// 危険な例:無限ループ
int x = 1;
do
{
Console.WriteLine(x);
// xを更新し忘れているため、x < 10 は永遠に true
} while (x < 10);
もしプログラムが止まらなくなってしまった場合は、コンソール上で「Ctrl + C」キーを押すことで強制終了させることができます。
変数のスコープ(有効範囲)に気をつける
do-while文のブロック内で宣言した変数は、そのブロックの外にあるwhileの条件式の中では使えません。
do
{
int result = GetValue(); // ブロック内で宣言
} while (result > 0); // エラー! resultはここでは参照できない
このように、条件判定でも使用する変数は、必ずループの開始前(doの外側)で宣言しておく必要があります。
複雑なメニュー選択の実装
ゲームのメニュー画面や、コマンドラインツールの操作選択などでもdo-while文は多用されます。
string choice;
do
{
Console.WriteLine("--- メニュー ---");
Console.WriteLine("1: プログラム実行");
Console.WriteLine("2: 設定変更");
Console.WriteLine("Q: 終了");
Console.Write("選択してください: ");
choice = Console.ReadLine().ToUpper();
if (choice == "1") Console.WriteLine("実行中...");
else if (choice == "2") Console.WriteLine("設定変更中...");
} while (choice != "Q"); // 'Q'が入力されるまでメニューを表示し続ける
このように、「終了条件が満たされるまで特定の操作を繰り返す」という構造を非常にシンプルに表現できるのがdo-while文の強みです。
まとめ
C#のdo-while文は、処理を一度実行した後に条件を判定するという特性を持つため、「最低1回は必ず動かしたい処理」を記述するのに最適な構文です。
while文との違いは、条件判定が「先か後か」という点に集約されます。
最後に、重要なポイントを振り返りましょう。
do-whileは「後判定ループ」であり、必ず1回は実行される。while (条件式)の後にセミコロン「;」を忘れずに付ける。- ユーザー入力のバリデーションや、リトライ処理などで非常に便利。
- 条件式で使う変数は、ループの外側で宣言する。
ループ処理のバリエーションを増やすことで、より複雑で実用的なアプリケーションを効率よく開発できるようになります。
ぜひ、この記事の内容を参考に、実際のコードを書いて動作を確認してみてください。
