対象:C言語経験者 / 基本はさらっと確認し、Javaで追加された拡張for文を中心に学びます
| ループの種類 | Java | C言語 |
|---|---|---|
for 文 | 同じ | 同じ |
while 文 | 同じ | 同じ |
do-while 文 | 同じ | 同じ |
for(;;) 無限ループ | 同じ | 同じ |
break / continue | 同じ | 同じ |
| 拡張 for 文(for-each)Java追加 | あり(配列やコレクションを簡潔に処理できる) | なし |
構文は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);
C言語と同様に、初期化式・条件式・増減式はそれぞれ省略できます。
// 初期化式を省略(変数がループ外で宣言されている場合)
int i = 0;
for (; i < 5; i++) { ... }
// 全部省略 → 無限ループ
for (;;) {
// breakで抜けるまでループし続ける
}
配列やコレクションの全要素を順番に処理するための構文です。C言語にはない機能です。
int[] data = {10, 20, 30, 40, 50};
for (int i = 0; i < data.length; i++) {
System.out.println(data[i]);
}
int[] data = {10, 20, 30, 40, 50};
for (int x : data) {
System.out.println(x);
}
読み方:for (int x : data) → 「data の各要素を x として」 繰り返す
| 通常の for 文 | 拡張 for 文 | |
|---|---|---|
| インデックスの取得 | できます(i を使える) | できません |
| 逆順や飛び番 | できます | できません(先頭から順番のみ) |
| 要素の値の変更 | できます(data[i] = ...) | できません(ループ変数を変えても配列は変わらない) |
| コードの簡潔さ | やや長い | 短く読みやすい |
x)を変更しても、元の配列には反映されません。for(;;) は全ての部分を省略した for 文で、無限ループになります。break で抜けます。
// for(;;) 無限ループ(C言語と同じ)
int k = 3;
for (;;) {
if (k > 7) break; // 条件を満たしたらループを抜ける
System.out.println(k);
k += 2;
}
トレース:
| k の値 | k > 7 の判定 | 出力 | k += 2 後 |
|---|---|---|---|
| 3 | false → 続行 | 3 | 5 |
| 5 | false → 続行 | 5 | 7 |
| 7 | false → 続行 | 7 | 9 |
| 9 | true → break | — | — |
「k > 7 のとき break」なので k = 7 のときはまだ出力されます。>= と > の違いに注意しましょう。
// continue:その回の処理を飛ばして次のループへ
for (int i = 0; i < 5; i++) {
if (i == 2) continue; // i=2 のときだけ飛ばす
System.out.println(i);
}
// 出力:0, 1, 3, 4
実習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 なので次回はすぐ終了
}
}
実行結果:
| # | 変えてみること | 確認ポイント |
|---|---|---|
| 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
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();
}
}
実行結果:
| # | 変えてみること | 確認ポイント |
|---|---|---|
| 1 | ① の for (int score : scores) 内で score = 100; と書いてみる |
エラーにはなりませんが scores の中身は変わりません。② で出力して確認しましょう |
| 2 | ③ の k > 7 を k >= 7 に変える |
k=7 のときに break するため、出力が「3 5」だけになります。境界値に注意しましょう |
| 3 | ④ の continue を break に変える |
n=0 の最初で止まるため何も出力されません。continue と break の違いを確認しましょう |
頻出ポイント
| よく問われること | 正しい答え |
|---|---|
for(;;) の動作 | 無限ループ。break で抜けるまで繰り返します |
| 拡張 for 文でループ変数を変えると | 元の配列には反映されません |
break と continue の違い | breakはループを抜ける。continueはその回だけ飛ばして次へ進みます |
| do-while と while の違い | do-while は条件に関わらず必ず1回は実行されます |
public class Q {
public static void main(String[] args) {
int k = 3;
for (;;) {
if (k > 7) break;
System.out.println(k);
k += 2;
}
}
}
k = 9 になったとき k > 7 が true になり break します。k = 7 のときはまだ 7 > 7 が false なので出力されます。
public class Q2 {
public static void main(String[] args) {
for (int x = 0; x < 5; x++) {
System.out.println(++x);
}
}
}
前置インクリメント ++x は println に渡す前に x を増やします。ループの増減式 x++ とあわせて1ループで x が2増えます。
| ループ開始時の x | x < 5 の判定 | ++x の値(表示) | x++ 後 |
|---|---|---|---|
| 0 | true | ++x → x=1、表示:1 | x=2 |
| 2 | true | ++x → x=3、表示:3 | x=4 |
| 4 | true | ++x → x=5、表示:5 | x=6 |
| 6 | false → 終了 | — | — |
| ポイント | 内容 |
|---|---|
| for / while / do-while | C言語と同じ。条件式は boolean 型が必要 |
| do-while | 必ず1回は実行される |
| 拡張 for 文 | for (型 変数 : 配列)。インデックス不要で全要素を処理できます |
| 拡張 for の制限 | 逆順・インデックス使用・要素の変更はできません |
for(;;) | 無限ループ。break で抜けます |
break | ループを完全に抜けます |
continue | その回の残りを飛ばして次の繰り返しへ進みます |