閉じる

【C#】do-while文の使い方!while文との違いや具体例を徹底解説

C#でプログラムを記述する際、同じ処理を何度も繰り返したい場面は頻繁に登場します。

一般的にはfor文やwhile文が多用されますが、特定のシチュエーションにおいて非常に強力な力を発揮するのがdo-while文です。

この構文の最大の特徴は、条件判定を処理の後に行うという点にあります。

本記事では、初心者の方でも確実にマスターできるよう、while文との決定的な違いや具体的な活用シーン、注意すべきポイントまでを徹底的に解説していきます。

C#における繰り返し処理とdo-while文の役割

C#の繰り返し構文の中で、do-while文は「後判定ループ」と呼ばれます。

通常のwhile文やfor文が「条件を満たしていなければ一度も実行されない」可能性があるのに対し、do-while文は必ず最低一回は処理が実行されることが保証されています。

これは、例えばユーザーに対して入力を促し、その内容が正しいかどうかを後から判定するような「まず動かしてみる」ことが必要な処理に最適です。

do-while文の基本構文

まずはdo-while文の書き方を確認しましょう。

構造は非常にシンプルですが、最後に;(セミコロン)が必要になる点に注意が必要です。

C#
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回 (必ず一度は実行される)
主な用途条件を満たす間だけ動かしたいとき処理の結果を見て継続を判断したいとき
構文末尾のセミコロン不要必要

具体的なコードでの比較

実際に、条件が最初から満たされていない場合の挙動をコードで見てみましょう。

C#
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文が最適です。

C#
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文がよく使われます。

C#
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を使用します。

C#
int i = 0;
do
{
    if (i == 5)
    {
        break; // iが5になったら、直ちにループを抜ける
    }
    Console.WriteLine(i);
    i++;
} while (i < 10);

continue文で次の回へスキップする

現在の回の処理を中断し、すぐにwhileの条件判定へ進みたい場合はcontinueを使用します。

C#
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(条件);という形式で最後にセミコロンが必要です。

C#
// 誤った例
do {
    // 処理
} while (i < 10) // ここでコンパイルエラー!

// 正しい例
do {
    // 処理
} while (i < 10); // セミコロンが必要

これは文法上のルールであり、忘れると「; が必要です」というエラーメッセージが表示されます。

初心者が最もハマりやすいポイントの一つですので、しっかり覚えておきましょう。

変数のスコープ(有効範囲)

doブロック内で宣言した変数は、whileの条件式の中では使用できません。

これは、変数のスコープがそのブロック{}内に限定されるためです。

C#
// 誤った例
do {
    int x = int.Parse(Console.ReadLine());
} while (x < 10); // エラー:変数 'x' は現在のコンテキストに存在しません

条件式で変数を使いたい場合は、必ずdoブロックの外側で変数を宣言しておく必要があります。

C#
// 正しい例
int x;
do {
    x = int.Parse(Console.ReadLine());
} while (x < 10); // OK

まとめ

C#のdo-while文は、「まず一度やってみて、その結果で続けるか決める」というロジックを簡潔に表現できる非常に便利なツールです。

今回のポイントを振り返ってみましょう。

  • 後判定ループであるため、最低でも必ず1回は処理が実行される。
  • while文は「実行前に判定」、do-while文は「実行後に判定」という違いがある。
  • ユーザー入力の受け付けや、リトライ処理、メニュー画面のループに最適。
  • 構文の最後には必ずセミコロン(;)を付ける。
  • 条件式で使う変数は、ループの外側で宣言する。

適切な場面でdo-while文を選択することで、コードの可読性は向上し、論理的なミスも減らすことができます。

while文との使い分けを意識して、より洗練されたC#プログラミングを目指しましょう。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!