初心者向けに、違いが一目で分かる比較表と図解を用意しました。
1. 一目でわかる比較表
| 観点 | for | while | do…while |
|---|---|---|---|
| 構文 | for(init; cond; step){ ... } | while(cond){ ... } | do { ... } while(cond); |
| 最低実行回数 | 0回(条件次第) | 0回(条件次第) | 1回は必ず実行 |
| 典型用途 | 回数が分かっているループ/配列の走査 | 条件が成り立つ間続ける(事前判定) | 最低1回は実行したい処理(入力・メニュー) |
| 初期化・更新の定位置 | 同じ行にまとめられる(可読性◎) | 本体や外で行う | 本体の中で更新することが多い |
| 無限ループになりやすい点 | 更新忘れで発生 | 更新忘れで発生 | 更新忘れで発生(初回実行のため気づきにくい) |
| 可読性 | 回数ループに最適 | 条件ベースに直感的 | 意図(最低1回実行)を示すのに向く |
2. 図解(動作フロー)
for(初期化 → 条件 → 本体 → 更新 → 条件 …)
start
|
v
init ---> cond? -no-> end
| yes
v
[ body ]
|
v
step
|
v
cond? -> ...
説明:init(初期化)を最初に一度だけ行い、cond が真の間 body を実行して step(更新)を行う。
while(条件 → 本体 → 条件 …)
start
|
v
cond? -no-> end
| yes
v
[ body ]
|
v
cond? -> ...
説明:最初に cond を評価するため、条件が偽だと0回実行される。
do…while(本体 → 条件 → 本体 …)
start
|
v
[ body ] <--(必ず1回実行)
|
v
cond? -yes-> [ body ]
|
no
v
end
説明:body を先に実行し、その後で cond を評価する。だから必ず1回は実行される。
3. 使用判断フローチャート(短い)
処理の目的は?
├─ 回数があらかじめ分かっている? ─ yes -> for
└─ no ->
├─ 最低1回は必ず実行したい? ─ yes -> do...while
└─ no -> while
4. 実例比較(同じ仕様を3種類で実装)
仕様:ユーザーが q を入力するまで、入力を表示する(最初に必ず一度表示)
for(非推奨・無限ループ形式で代替)
for(;;) {
String s = sc.nextLine();
if (s.equals("q")) break;
System.out.println(s);
}
Javawhile(最初に1回読み取りが必要)
String s = sc.nextLine();
while (!s.equals("q")) {
System.out.println(s);
s = sc.nextLine();
}
Javado...while(最も自然)
String s;
do {
s = sc.nextLine();
System.out.println(s);
} while (!s.equals("q"));
Java5. よくあるミスと対処
- セミコロン忘れ(
do { ... } while(cond)の末尾)→ コンパイルエラー。 - ループ変数の更新忘れ → 無限ループ。小さい値で紙にトレースして確認。
- 入力で
nextInt()使うと例外が出る可能性 →hasNextInt()か try/catch で対処。
6. まとめ(1行)
forは「回数が分かっているとき」、whileは「条件を先に確かめたいとき(0回あり得る)」、do...whileは「最低1回は実行したいとき」に使う。
