以下は違いをパッと比較できる「使い分け表」と、実践的な判断ルール・例です。初心者が迷いやすいポイントを中心にまとめました。
概要
for:回数が分かっている時や初期化・更新が決まっている反復に最適。while:条件を先にチェックして条件が成り立つ間だけ繰り返す(0回もあり得る)。do...while:最低1回は必ず実行したいときに使う(処理→条件チェックの順)。
比較表
| 観点 | for | while | do…while |
|---|---|---|---|
| 構文の特徴 | for(init; cond; step){} — 初期化・条件・更新を1行で書ける | while(cond){} — 条件を先に評価 | do { } while(cond); — 本体を先に1回実行してから条件評価 |
| 最低実行回数 | 0回(条件次第) | 0回(条件次第) | 1回(必ず1回実行) |
| 典型的な用途 | 固定回数ループ、配列やリストのインデックス処理 | 条件が変わるまで繰り返す(事前判定) | ユーザー入力/メニューの最初の一回表示など(事後判定) |
| 可読性 | 初期化/更新が明確 → 読みやすい | シンプルで直感的 | 「最低1回実行」が明確に伝わる場合に有効 |
| 無限ループになりやすいか | 更新忘れでなり得る | 更新忘れでなり得る | 更新忘れでもなり得る(初回必ず実行されるため気づきにくい) |
| 使わない方がよいケース | 条件ベースで初回実行不要なとき | 初回実行を必須にしたいとき | 初回実行が不要なとき(0回が許容される) |
| 例(疑似コード) | for(i=0;i<10;i++) | while(scan.hasNext()) | do { input = next(); } while(!valid(input)); |
いつどれを選ぶか:実践ルール(チェックリスト)
- 「最低1回は処理を実行する必要があるか?」
- はい →
do...whileを検討。 - いいえ(0回でもよい) →
whileまたはfor。
- はい →
- 「反復回数が事前にわかるか?」
- はい →
for(初期化・更新をまとめて書ける)。 - いいえ →
while(またはdo...while)を使う。
- はい →
- 「ループ本体で条件を変える(入力を受ける等)必要があるか?」
- 入力を最低1回受けてから判定する →
do...whileが自然。 - 判定を最初にしてから処理を始める →
while。
- 入力を最低1回受けてから判定する →
- 「可読性を優先するか?」
- 初期化と更新が密接なら
for。条件が重要ならwhile。動作の仕様(最低1回)が重要ならdo...while。
- 初期化と更新が密接なら
小さなコード例(比較)
同じ動作(ユーザーが q を入力するまで繰り返す)を3つで書いてみる:
for(あまり自然ではない):
// for で無理やり:回数を大きめにとって break で抜ける例(非推奨)
for (;;) {
String s = sc.nextLine();
if (s.equals("q")) break;
System.out.println(s);
}
Javawhile(事前チェックがある場合):
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"));
Java→ do...while は「まず読み取って表示 → ‘q’ なら終了」という仕様にぴったり。
よくある誤りと対処
- セミコロン忘れ(
do { ... } while (cond)の末尾):コンパイルエラーになる → 慌てず付ける。 - ループ変数を更新し忘れる:無限ループの原因 → 小さな値で手動トレースして確認。
do...whileで「0回でもいい」ケースに使ってしまい、意図しない1回実行が入る → 仕様を再確認してから使う。- 入力処理で
Scanner.nextInt()等を使うと入力不正で例外 →hasNextInt()で事前チェック、または try/catch。
パフォーマンス面
for/while/do...whileの実行速度差は通常無視して良い(JVM最適化により同等)。可読性・意図の明示が優先。
推奨(初心者向け)
- 配列やリストをインデックスで回す/回数が確定している →
forを使おう。 - 「条件が成り立つ間だけ繰り返す(0回あり得る)」 →
while。 - 「最低1回は必ず実行したい(ユーザー入力の最初の読み取りやメニュー表示)」 →
do...while。
