06_ループ(for・while)

対象:C言語経験者 / 基本はさらっと確認し、Javaで追加された拡張for文を中心に学びます


■ 1. C言語との差分まとめ

ループの種類JavaC言語
for同じ同じ
while同じ同じ
do-while同じ同じ
for(;;) 無限ループ同じ同じ
break / continue同じ同じ
拡張 for 文(for-each)Java追加あり(配列やコレクションを簡潔に処理できる)なし
基本的なループはC言語と全く同じです。この単元では 拡張for文試験頻出の無限ループパターン を重点的に学びます。

■ 2. for文・while文(確認)

構文はC言語と同じです。条件式が boolean 型である必要がある点だけ意識しておきましょう(if文と同じルール)。

// for文(C言語と全く同じ)
for (int i = 0; i < 5; i++) {
    System.out.println(i);
}

// while文(C言語と全く同じ)
int i = 0;
while (i < 5) {
    System.out.println(i);
    i++;
}

// do-while文(C言語と全く同じ:必ず1回は実行される)
int i = 0;
do {
    System.out.println(i);
    i++;
} while (i < 5);

● for文の3つの部分は省略できる

C言語と同様に、初期化式・条件式・増減式はそれぞれ省略できます。

// 初期化式を省略(変数がループ外で宣言されている場合)
int i = 0;
for (; i < 5; i++) { ... }

// 全部省略 → 無限ループ
for (;;) {
    // breakで抜けるまでループし続ける
}

■ 3. 拡張for文(for-each)Java追加

配列やコレクションの全要素を順番に処理するための構文です。C言語にはない機能です。

通常の for 文(インデックスを使う)
int[] data = {10, 20, 30, 40, 50};

for (int i = 0; i < data.length; i++) {
    System.out.println(data[i]);
}
拡張 for 文(要素を直接取り出す)
int[] data = {10, 20, 30, 40, 50};

for (int x : data) {
    System.out.println(x);
}

読み方:for (int x : data)「data の各要素を x として」 繰り返す

配列 data: 10 20 30 40 50 変数 x(毎回入れ替わる): 10 ← 1回目 x=10 x=20 x=30 x=40 x=50 1回目 2回目 3回目 4回目 5回目
先頭の要素から順番に取り出して変数 x に入れながら処理します。インデックスを書く必要がありません。

● 拡張for文の注意点

通常の for 文拡張 for 文
インデックスの取得できます(i を使える)できません
逆順や飛び番できますできません(先頭から順番のみ)
要素の値の変更できます(data[i] = ...できません(ループ変数を変えても配列は変わらない)
コードの簡潔さやや長い短く読みやすい
拡張 for 文のループ変数(x)を変更しても、元の配列には反映されません
配列の内容を変更したい場合は通常の for 文を使いましょう。

■ 4. 無限ループと break(試験頻出)

for(;;) は全ての部分を省略した for 文で、無限ループになります。break で抜けます。

// for(;;) 無限ループ(C言語と同じ)
int k = 3;
for (;;) {
    if (k > 7) break;     // 条件を満たしたらループを抜ける
    System.out.println(k);
    k += 2;
}
この出力を予想してから確認しましょう(第67回 問4(25) と同じパターン)
3 5 7

トレース:

k の値k > 7 の判定出力k += 2 後
3false → 続行35
5false → 続行57
7false → 続行79
9true → break

「k > 7 のとき break」なので k = 7 のときはまだ出力されます。>=> の違いに注意しましょう。

● continue の動作(C言語と同じ)

// continue:その回の処理を飛ばして次のループへ
for (int i = 0; i < 5; i++) {
    if (i == 2) continue;   // i=2 のときだけ飛ばす
    System.out.println(i);
}
// 出力:0, 1, 3, 4

■ 実習1:ループの基本を確認する

実習1

06_LoopBasic フォルダに LoopBasic.java を作って実行しましょう。

public class LoopBasic {
    public static void main(String[] args) {

        // ① 通常の for 文
        System.out.println("--- for ---");
        for (int i = 1; i <= 5; i++) {
            System.out.print(i + " ");
        }
        System.out.println();

        // ② while 文(同じ処理を書き換え)
        System.out.println("--- while ---");
        int i = 1;
        while (i <= 5) {
            System.out.print(i + " ");
            i++;
        }
        System.out.println();

        // ③ do-while 文(必ず1回は実行)
        System.out.println("--- do-while ---");
        int j = 10;          // 条件を最初から満たさない値
        do {
            System.out.println("j = " + j);  // 1回は実行される
            j++;
        } while (j < 5);    // j=10 なので次回はすぐ終了
    }
}

実行結果:

--- for --- 1 2 3 4 5 --- while --- 1 2 3 4 5 --- do-while --- j = 10

● 動いたら変えてみましょう

#変えてみること確認ポイント
1 ③ の do-while を通常の while に書き換える while (j < 5) { ... } にすると j=10 で条件が false なので一度も実行されません。do-while との違いを確認しましょう
2 ① を for (int i = 5; i >= 1; i--) に変える 逆順(5 4 3 2 1)になることを確認しましょう
3 ① の i++ を書き忘れて while (true) { ... } にしてみる 無限ループになります。VSCodeのターミナルで Ctrl+C を押して強制終了しましょう

■ 実習2:拡張for文と無限ループを確認する

実習2

07_LoopAdvanced フォルダに LoopAdvanced.java を作って実行しましょう。

public class LoopAdvanced {
    public static void main(String[] args) {

        int[] scores = {85, 62, 91, 47, 78};

        // ① 拡張for文で合計を求める
        System.out.println("--- 拡張for文 ---");
        int total = 0;
        for (int score : scores) {
            total += score;
        }
        System.out.println("合計: " + total);
        System.out.println("平均: " + (double) total / scores.length);

        // ② 通常for文との比較(インデックスが必要な場合)
        System.out.println("\n--- インデックス付き出力 ---");
        for (int i = 0; i < scores.length; i++) {
            System.out.println((i + 1) + "番: " + scores[i]);
        }

        // ③ for(;;) 無限ループ + break
        System.out.println("\n--- 無限ループ ---");
        int k = 3;
        for (;;) {
            if (k > 7) break;
            System.out.println(k);
            k += 2;
        }

        // ④ continue で偶数だけ飛ばす
        System.out.println("\n--- continue ---");
        for (int n = 0; n < 8; n++) {
            if (n % 2 == 0) continue;  // 偶数を飛ばす
            System.out.print(n + " ");
        }
        System.out.println();
    }
}

実行結果:

--- 拡張for文 --- 合計: 363 平均: 72.6 --- インデックス付き出力 --- 1番: 85 2番: 62 3番: 91 4番: 47 5番: 78 --- 無限ループ --- 3 5 7 --- continue --- 1 3 5 7

● 動いたら変えてみましょう

#変えてみること確認ポイント
1 ① の for (int score : scores) 内で score = 100; と書いてみる エラーにはなりませんが scores の中身は変わりません。② で出力して確認しましょう
2 ③ の k > 7k >= 7 に変える k=7 のときに break するため、出力が「3 5」だけになります。境界値に注意しましょう
3 ④ の continuebreak に変える n=0 の最初で止まるため何も出力されません。continue と break の違いを確認しましょう

■ 試験(問4・問5)との対応

頻出ポイント

よく問われること正しい答え
for(;;) の動作無限ループ。break で抜けるまで繰り返します
拡張 for 文でループ変数を変えると元の配列には反映されません
breakcontinue の違いbreakはループを抜ける。continueはその回だけ飛ばして次へ進みます
do-while と while の違いdo-while は条件に関わらず必ず1回は実行されます
練習問題:次の出力を答えましょう(第67回 問4(25) 類似)
public class Q {
    public static void main(String[] args) {
        int k = 3;
        for (;;) {
            if (k > 7) break;
            System.out.println(k);
            k += 2;
        }
    }
}
3 5 7

k = 9 になったとき k > 7 が true になり break します。k = 7 のときはまだ 7 > 7 が false なので出力されます。

練習問題2:次の出力を答えましょう(第63回 問4(27) 類似)
public class Q2 {
    public static void main(String[] args) {
        for (int x = 0; x < 5; x++) {
            System.out.println(++x);
        }
    }
}
1 3 5

前置インクリメント ++x は println に渡す前に x を増やします。ループの増減式 x++ とあわせて1ループで x が2増えます。

ループ開始時の xx < 5 の判定++x の値(表示)x++ 後
0true++x → x=1、表示:1x=2
2true++x → x=3、表示:3x=4
4true++x → x=5、表示:5x=6
6false → 終了

■ まとめ

ポイント内容
for / while / do-whileC言語と同じ。条件式は boolean 型が必要
do-while必ず1回は実行される
拡張 for 文for (型 変数 : 配列)。インデックス不要で全要素を処理できます
拡張 for の制限逆順・インデックス使用・要素の変更はできません
for(;;)無限ループ。break で抜けます
breakループを完全に抜けます
continueその回の残りを飛ばして次の繰り返しへ進みます