whileループ

whileループは、if文とよく似ており、基本的にif文を繰り返し実行する。ifと同様に、whileも論理式を受け取り、論理式がtrueの場合にブロックを評価する。違いは、while文は、論理式がtrueである限り、論理式を評価し、ブロック内の式を1回だけ実行するのではなく、繰り返し実行することだ。このようにコードのブロックを繰り返し実行することを、ループと呼ぶ。

while文の構文は次の通りだ。

while (a_logical_expression) {
    // ... trueの間実行する式
}
D

例えば、クッキーがある限りクッキーを食べ続けることを表すコードは、次のように記述できる。

import std.stdio;

void main() {
    bool existsCookie = true;

    while (existsCookie) {
        writeln("Take cookie");
        writeln("Eat cookie");
    }
}

このプログラムは、existsCookieの値がtrueから変化しないため、ループを繰り返し続ける。

whileは、プログラムの実行中に論理式の値が変化する場合に便利だ。これを確認するために、数値が0以上の間、ユーザーから数値を入力するプログラムを作成しよう。int変数の初期値は0であることを覚えておいてほしい。

import std.stdio;

void main() {
    int number;

    while (number >= 0) {
        write("Please enter a number: ");
        readf(" %s", &number);

        writeln("Thank you for ", number);
    }

    writeln("Exited the loop");
}

このプログラムは、入力された数値に感謝し、数値が0未満になった場合にのみループを終了する。

continue

continue文は、ブロックの残りの式を実行せずに、ループの次の反復をすぐに開始する。

上記のプログラムを少し厳密に変更しよう。任意の数字に対して"ありがとう"と表示する代わりに、13は受け付けないようにする。次のプログラムでは、13に対して"ありがとう"と表示しない。なぜなら、その場合はcontinue文によってプログラムがループの先頭に戻り、論理式が再度評価されるからだ。

import std.stdio;

void main() {
    int number;

    while (number >= 0) {
        write("Please enter a number: ");
        readf(" %s", &number);

        if (number == 13) {
            writeln("Sorry, not accepting that one...");
            continue;
        }

        writeln("Thank you for ", number);
    }

    writeln("Exited the loop");
}

このプログラムの動作を"0以上であれば数値を受け取り、13はスキップする"と定義できる。

continueは、do-whilefor、およびforeach文でも同様に動作する。これらの機能については、後の章で説明する。

break

whileループから抜け出す必要がなくなった場合、breakを使用すると、プログラムはすぐにループから抜け出せる。次のプログラムは、特別な数値が見つかった時点でループから抜け出す。

import std.stdio;

void main() {
    int number;

    while (number >= 0) {
        write("Please enter a number: ");
        readf(" %s", &number);

        if (number == 42) {
            writeln("FOUND IT!");
            break;
        }

        writeln("Thank you for ", number);
    }

    writeln("Exited the loop");
}

この動作を要約すると、"数値が0以上であるか、または数値が42になるまで数値を受け取る"となる。

breakは、do-whileforforeachswitch文でも機能する。これらの機能については、後の章で説明する。

無条件ループ

論理式を意図的に定数trueにする場合がある。break文は、このような無条件ループを終了するための一般的な方法だ。(無限ループは、無条件ループを意味する別の用語だが、完全に正確ではない。)

次のプログラムは、無条件ループでメニューを表示する。このループを終了する唯一の方法は、break文を使うことだ。

import std.stdio;

void main() {
    /* 論理式は常に真であるため、無条件ループ
     *  */
    while (true) {
        write("0:Exit, 1:Turkish, 2:English - Your choice? ");

        int choice;
        readf(" %s", &choice);

        if (choice == 0) {
            writeln("See you later...");
            break;   // このループの唯一の終了条件

        } else if (choice == 1) {
            writeln("Merhaba!");

        } else if (choice == 2) {
            writeln("Hello!");

        } else {
            writeln("Sorry, I don't know that language. :/");
        }
    }
}

注釈: 例外も無条件ループを終了させることができる。例外については、後の章で説明する。

演習
  1. 次のプログラムは、入力が3の間ループを続けるように設計されているが、バグがある:入力要求が表示されない:
    import std.stdio;
    
    void main() {
        int number;
    
        while (number == 3) {
            write("Number? ");
            readf(" %s", &number);
        }
    }

    バグを修正して、入力が3の間ループを続けるようにする。

  2. コンピュータがアンナとビルがゲームをするのを手伝うようにしよう。まず、コンピュータはアンナから1から10までの範囲の数字を受け取る必要がある。プログラムは他の数字を受け入れてはならず、再度入力するように促す必要がある。

    アンナから有効な数字を受け取ったら、ビルから数字を受け取り続け、ビルがアンナの数字を正しく当てるまで続ける。

    注釈:アンナが入力した数字は、当然ながら端末に残り、ビルにも見える。この事実を無視して、while文の演習としてプログラムを書いてみよう。