do-while で必ず 1 回は実行する
このレッスンで分かること
do { ... } while (条件);は条件チェックより先に 必ず 1 回 本体を実行する後判定ループです- 文末のセミコロン
;が必須、書き忘れるとSyntaxError- 最小例は
do { result.push(i); i++; } while (i < n);
do-while で必ず 1 回は実行する とは
条件チェックの前に必ず 1 回は本体を実行する
do-while文を学び、0 でも 1 回回るループを書こう。
do-while は「条件チェックより先に 1 回は実行する」ループ
前のレッスンでは while 文を学びました。while は「条件が true の間だけ回る」ループでしたね。今回はその兄弟分、do-while 文を学びます。do-while は「条件チェックより先に必ず 1 回は本体を実行する」という、ちょっと変わった性格のループです。
JavaScriptの繰り返し構文には主にforwhiledo-whilefor-offor-inの 5 種類があります。その中でdo-whileの出番は決して多くありませんが、「最低 1 回は処理を実行したい」というシーンでは非常に役立ちます。例えばユーザーに何かを入力させて、その内容が正しいかチェックし、正しくなければ再度入力させる、といった対話的な処理で本領を発揮します。
試しに、引数 n に対して 0 以上の間だけ i を配列に追加していく処理を考えてみましょう。while で書くとこうなります。
JavaScript
function collectWhile(n) {
const result = [];
let i = 0;
while (i < n) {
result.push(i);
i++;
}
return result;
}collectWhile(0) を呼ぶと、while (i < n) の条件が 最初から false なので、本体は 1 回も実行されず [] が返ります。
一方、同じことを do-while で書くと挙動が違います。
JavaScript
function collectDoWhile(n) {
const result = [];
let i = 0;
do {
result.push(i);
i++;
} while (i < n);
return result;
}collectDoWhile(0) を呼ぶと、条件チェックの前に 本体が 1 回実行される ため、result には 0 が push されます。その後 i が 1 になり、while (1 < 0) が false でループ終了。結果として [0] が返ります。これが while と do-while の最大の違いです。
do-while 文の文法
JavaScript の do-while 文の基本形は次のとおりです。
JavaScript
do {
// 繰り返したい処理
} while (条件);大事なポイントは次のとおりです。
doキーワード で始まる- 本体ブロック
{ ... }が先に来る - ブロックの 後 に
while (条件)を書く - 最後の セミコロン
;を忘れない (これを書き忘れるとSyntaxErrorになる)
通常の while と違って、文末にセミコロンが必要です。ここを忘れる人が多いので、書き終わったら必ず ; があるか確認しましょう。
do-whileは名前の通り「まず実行し、それから条件を判定する」という後判定ループです。whileの前判定ループとは挙動が反対なので、whileで書けないシーンに限って使うのが鉄則です。「whileで書ける場合はwhileを使う」と覚えておくと迷いません。
while と do-while の使い分け
どちらを使うか迷ったら、次の基準で判断しましょう。
- 条件が最初から
falseのときに 本体を実行したくない →whileを使う - 条件にかかわらず 最低 1 回は本体を実行したい →
do-whileを使う
| 観点 | while (前判定) | do-while (後判定) |
|---|---|---|
| 条件チェック | 本体の前 | 本体の後 |
| 最小実行回数 | 0 回 (条件次第) | 必ず 1 回 |
| 末尾のセミコロン | 不要 | 必須 |
| 向いている用途 | リストが空になるまで など | ユーザー入力の検証 など |
具体例として、ユーザー入力の処理が分かりやすいです。
JavaScript
function askUserName() {
let name;
do {
name = prompt('名前を入力してください');
} while (!name);
return name;
}これを while で書くと「name がまだ未定義なのに条件チェック」となって不自然です。
JavaScript
function askUserNameBad() {
let name = '';
while (!name) {
name = prompt('名前を入力してください');
}
return name;
}こっちは while の前に name = '' のような ダミーの初期値 を入れる必要があり、読み手にひと目で意図が伝わりません。do-while のほうがこのケースでは素直です。
実行フローを図で追ってみる
do { ... } while (i < n) の流れは次のとおりです。
while の図と比べてみると、条件判定が本体の後に来ている のが分かります。これが「先に 1 回実行」の正体です。
よくある間違い
do-while 文を使い始めるとき、初心者がハマる落とし穴が 3 つあります。
- 末尾のセミコロンを書き忘れる —
} while (i < n)で終わってしまうとSyntaxErrorです。必ず} while (i < n);のようにセミコロンを付けましょう whileと区別せずに使う —do-whileは最低 1 回必ず実行されるので、入力の検証など「初回だけは無条件にやりたい」場面以外で使うと、想定外に 1 回多く回ってバグの温床になります- 更新を忘れて無限ループ —
do { result.push(i); } while (i < n);のようにi++を忘れると無限ループです。whileと同じく、本体の中で必ず更新処理を入れましょう
do-whileの出番は実際の開発ではwhileよりずっと少ないです。でも知識として知っておくと、コードレビューで「ここdo-whileのほうが適切では?」と提案できる場面が出てきます。「使う場面が少ない構文ほど、適材適所で使えると評価が上がる」というのもプログラミングあるあるです。
もうひとつ、do-while の条件式は普通の while と同じく boolean を返す式なら何でも書けます。i < n のような比較演算子だけでなく、isValidInput(input) === false のような関数呼び出しも書けます。柔軟性は while と同じです。
ここまでの要点
do-while は後判定で必ず 1 回実行、文末のセミコロンが必須。while で書けるなら while、初回だけは無条件にやりたいなら do-while。
やってみよう
それでは今回の課題に取り組みましょう。手順は次のとおりです。
- 関数
runOnce(n)を定義する let i = 0;と空配列const result = [];を準備するdo { result.push(i); i++; } while (i < n);の形で書くreturn result;で配列を返すrunOnce(0)が[0]、runOnce(3)が[0, 1, 2]を返すか確認
n = 0 のときも i = 0 が 1 回 push されてから条件チェックされるため、結果は [0] になります。
余裕があれば、同じ動きを while で書こうとして、なぜ素直に書けないか考えてみてください。while だと条件が false のとき 1 回も実行されないので、if + while の組み合わせや、フラグ変数の導入が必要になります。do-while がいかにエレガントか実感できるはずです。
この先のレッスンでは for-of for-in といった配列・オブジェクトに特化したループや、break continue のループ制御を学びます。ループ系の基本構文はこれでひと通り出揃いです、しっかり手を動かして覚えましょう。
よくある質問
Q. while で無限ループを止めるには?
A. ループ内で必ずカウンタを更新するか、break で抜ける条件を書きます。たとえば i = 0; while i < 10: i += 1 のように i += 1 を忘れると永久に止まりません。Ctrl+C で強制終了できますが、デバッグ時はループの 1 周目で print(i) を入れて挙動を確認すると原因が見えます。
Q. while と for はどう違いますか?
A. 繰り返し回数が決まっていれば for、終了条件が動的なら while が向いています。リスト走査や range は for で書く方が安全で、ユーザー入力が来るまで・センサー値が閾値を超えるまで、のようなケースは while True + break が定石です。
Q. do-while のように最低 1 回は実行したい場合は?
A. Python には do-while がないため、while True: ... if cond: break のパターンで再現します。JavaScript なら do { ... } while (cond) と書けます。「最初の 1 回は条件を見ずに走らせる」処理(入力受付など)で有効です。
次のレッスン
次は for-of で配列を走査する で、条件チェックの前に必ず 1 回は本体を実行する do-while 文を学び、0 でも 1 回回るループを書こう を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- do-while の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. do-while とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- 関数名は
runOnce、引数はn1 つ、戻り値は数値の配列 - 繰り返し処理には必ず
do-while文を使うこと (whileやforではなく) nが0でも最低 1 回は本体が実行され、[0]が返ること
入出力例
test-cases.txt
runOnce(3) → [0,1,2]
runOnce(1) → [0]
runOnce(0) → [0]
runOnce(5) → [0,1,2,3,4]