do-while で必ず 1 回は実行する

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

このレッスンで分かること

  • 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 の繰り返し構文には主に for while do-while for-of for-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 には 0push されます。その後 i1 になり、while (1 < 0)false でループ終了。結果として [0] が返ります。これが whiledo-while の最大の違いです。

do-while 文の文法

JavaScriptdo-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) の流れは次のとおりです。

diagram (will load when visible)

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

やってみよう

それでは今回の課題に取り組みましょう。手順は次のとおりです。

  1. 関数 runOnce(n) を定義する
  2. let i = 0; と空配列 const result = []; を準備する
  3. do { result.push(i); i++; } while (i < n); の形で書く
  4. return result; で配列を返す
  5. 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 つができることを確認しましょう。

  1. do-while の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. do-while とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. 関数名は runOnce、引数は n 1 つ、戻り値は数値の配列
  2. 繰り返し処理には必ず do-while 文を使うこと (whilefor ではなく)
  3. n0 でも最低 1 回は本体が実行され、[0] が返ること

入出力例

test-cases.txt

runOnce(3)[0,1,2] runOnce(1)[0] runOnce(0)[0] runOnce(5)[0,1,2,3,4]

ヒント

main.js
main.js
学習モード

メモ

do-while で必ず 1 回は実行する

⌘S で保存