Skip to content

Java講座: 制御構文(繰り返し)

同じ処理を何度も行いときに使うのが繰り返し処理です。Javaではwhile文for文が使えます。

while文

「〇〇である間ずっと××する」といった処理を行いたいときに使います。構文は以下の通りです。

構文

java
while (条件式) {
    // 処理
}

プログラム例

以下のプログラムを実際に実行してみて、同じ処理がちゃんと繰り返されていることを確認してみましょう。

java
public class Main {
    public static void main(String[] args) {
        int i = 1;

        while (i < 6) {
            System.out.println(i + "回目のループです");
            i++;
        }
    }
}

この処理は5回繰り返されるはずです。繰り返すたびにi++によってiはインクリメントされ、iが6になったタイミングで条件式を満たさなくなるためです。

無限ループ

while文は条件式がtrueである限り繰り返す構文です。ではこのように書いたらどうなるでしょう?

java
int i = 1;
while (true) {
    System.out.println(i + "回目のループです");
    i++;
}

結論から言うと、このプログラムは一度実行するとずっと動き続けてしまいます。
このように、条件式が常にtrueとなると無限ループという現象が起きます。無限ループはコンピュータへの負荷を書けたり、プログラムをフリーズさせる原因となるため、基本的には避けるべきです。

一方で、意図的に無限ループを発生させることもあります。その際には、手動でループから脱出・制御できる方法を確保しておかなければなりません。
手動でループを制御する方法として、breakcontinue命令があります。

break命令

break命令については前回のswitch文で一度使っています。switch文のときと同様、ループなどの処理から抜け出すことができる命令です。実際にプログラムを書いたほうがわかりやすいでしょう。

プログラム例

「1から順番に自然数を足していき、何回目の足し算で合計が100を超えるか」というプログラムです。

java
public class Main {
    public static void main(String[] args) {
        int i = 1;
        int sum = 0; // 合計を表す変数

        while (true) {
            sum += i; // sum = sum + i;と同じ

            if (sum > 100) {
                break;
            }

            i++;
        }

        System.out.println("合計が100を超えるのは、" + i + "回目の計算のときです。");
    }
}

while (true)によって本来無限ループとなるはずですが、break命令によって途中でループを脱出しています。

continue命令

break命令がループそのものを抜け出す命令であるのに対し、continue命令は現在の周回だけをスキップできる命令です。

プログラム例

「1から100までの自然数の中で、偶数のみを足した合計」を求めるプログラムです。

java
public class Main {
    public static void main(String[] args) {
        int i = 1;
        int sum = 0;

        while (i <= 100) {
            if (i % 2 != 0) {
                i++;
                continue;
            }

            sum += i;
            i++;
        }

        System.out.println("合計値は " + sum + "です。");
    }
}

このように、「この条件を満たすときだけループをスキップしたい」と思ったときにcontinue命令が役に立ちます。

for文

for文は、あらかじめループしたい回数が決まっているときに使う構文です。おそらくこっちのほうが今後使う機会は多いでしょう。

for文の構文は以下の通りです。一つずつ説明します。

構文

java
for (初期化式; 継続条件式; 増減式) {
    // ...
}

とりあえず実際に書くときのサンプルコードを添付します。
これは「5回だけ繰り返し『Hello,world!』を出力するプログラム」です。

java
public class Main {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            System.out.println("Hello, world!");
        }
    }
}

初期化式は、for文のループに初めて入った瞬間に一度だけ実行されます。サンプルコードではint i = 0;と書かれていますね。
このように、ここでは一般的にはカウンターとして使用する変数を初期化します。カウンター変数にはi,j,k...を使用する暗黙のルールがあります。特に理由がない限り、これらの変数名を使うのが良いでしょう。

継続条件式は、ループを継続する条件を表す式です。while文の条件式と同じだと考えて大丈夫です。

増減式は、ループ内の処理が1回終わるごとに実行される式です。基本的にはi++といったカウンター変数をインクリメントする式を使いがちです。ただし、i += 2とすればループのたびにiを2ずつ増やすこともできますし、i--とすればデクリメントすることもできます。

練習問題

for文はこの先いっぱい使うので練習しておきましょう!

https://atcoder.jp/contests/abc272/tasks/abc272_a
https://atcoder.jp/contests/abc288/tasks/abc288_a

for文を使うときの注意点

for文の初期化式で初期化された変数は、for文の中でしか使用することはできません!
例えば、以下のコードはエラーになります。

java
for (int i = 0; i < 5; i++) {
    System.out.println(i + "回目のループです");
}
System.out.println("全部で" + i + "回ループしました"); // iをfor文の外で使ってしまっている!

この他にも、if文やfor文の中で宣言・初期化された変数はその文の中でしか使用することができません。

筆者はプログラミング学びたての頃これに気付かず無限にエラーを吐き続けていました。みなさんはこうならないように。