do-while 文
見てから決めたいのに、見る前に判定されてしまう
while (条件) { ... } は、中に入る前に条件を見ます。だから条件が最初から false だと、中身は一度も動きません。ふだんはそれで正しいのですが、困る場面があります。
たとえば「年齢を入力してもらい、おかしな値なら聞き直す」処理です。おかしいかどうかは、入力してもらったあとでないと判定できません。つまり最初の 1 回だけは、条件を見ずに走らせる必要があります。
本体が先、条件が後
そのための構文が do-while です。
Java
do {
// 先にここが動く
} while (条件);判定がうしろに移っただけで、動きは while とほとんど同じです。違うのは最低実行回数だけで、while は 0 回、do-while は必ず 1 回です。さっきの入力の例はこう書けます。
Java
int age;
do {
age = readAge();
} while (age < 0 || age > 150);まず 1 回聞く、変な値ならもう一度聞く、という流れがそのまま上から下に並びます。
末尾の ; を忘れる
do-while は while (条件); まで含めて 1 つの文です。} のあとのセミコロンが必須で、忘れると ';' expected というコンパイルエラーになります。if や while では書かない場所なので、ここだけ意識してください。
もうひとつ、do の直後に ; を書いてしまうミスもあります。do; { ... } while (cond); はエラーになりません。空の文を 1 回実行するだけの do-while になり、{ ... } はループの外側にある普通のブロックとして扱われます。エラーが出ないぶんタチが悪いので、do のうしろは必ず空白か改行にしてください。
やってみよう
Solution.firstPositive(int start) を、do-while を使って完成させましょう。start から 1 ずつ上げていき、最初に見つかった正の数を返します。
順番がすべてです。本体の先頭でいま持っている値を見る、正でなければそこから 1 進める。この順番なら firstPositive(5) はその場で 5 を返します。逆に先に 1 進めてしまうと、もともと条件を満たしていた入力が 1 つずれて 6 になります。
もうひとつ、0 は正の数ではありません。Java の > は厳密な大なりなので、0 > 0 は false です。firstPositive(0) の答えが 1 になるのはそのためです。
値を進める行を書き忘れれば、当然ながら止まりません。do-while でも while でも、そこは同じです。
要件
- クラス名は
Solution、メソッド名はfirstPositiveにすること - 引数は
int startの 1 つ、戻り値の型はint do-while文を必ず使って 繰り返しを書くこと (while文やfor文だけで書くのは NG)
入出力例
firstPositive(-3) → 1
firstPositive(5) → 5
firstPositive(0) → 1
firstPositive(1) → 1
firstPositive(-100) → 1
firstPositive(42) → 42