ループの罠

ループの罠

このレッスンでできるようになることは、for と do-while の回る回数の違いを見抜き、無限ループの合法な書き方を判別できることです。

まず予測してください

次のコードで、f と d はそれぞれいくつになるでしょうか。

int n = 0; int f = 0; for (int i = 0; i < n; i++) { f++; } int d = 0; int j = 0; do { d++; j++; } while (j < n);

答えは f が 0、d が 1 です。for は本体に入る前に条件を見るので、n が 0 なら一度も本体を実行しません。do-while は本体を実行してから条件を見るので、条件が最初から偽でも必ず 1 回は回ります。試験はこの「do-while は最低 1 回」をよく突いてきます。

for の空欄

for 文の丸括弧の中は、初期化部・条件部・更新部の 3 つに分かれています。この 3 つはすべて省略できます。for (;;) は条件部が真とみなされる無限ループで、コンパイルは問題なく通ります。セミコロンを 2 つ書くことが必須で、for () と書くとコンパイルエラーです。

一方 while は条件を省略できません。while () はコンパイルエラーで、無限ループにしたいときは while (true) と書きます。この非対称が引っ掛けの材料になります。

for (;;) も本体に入ってから break で抜ける形なので、こちらも本体は必ず 1 回は実行されます。

初期化部と更新部のカンマ

初期化部と更新部には、カンマで複数の式を並べられます。ただし初期化部で宣言できるのは 1 つの型だけです。for (int i = 0, j = 10; i < j; i++, j--) は合法ですが、型を 2 回書いた for (int i = 0, long j = 0; ...) はコンパイルエラーになります。

変数のスコープ

for の初期化部で宣言した変数は、その for 文の中だけで生きています。ループを抜けたあとに i を参照するとコンパイルエラーです。ループ後に値を使いたいなら、for の外で宣言してから初期化部で代入だけを行います。

要件

  1. for 文で f を数える
  2. do-while 文で d を数える。条件は while (j < n) にする
  3. for (;;) と break で e を数える。break の条件は e >= n にする
  4. 戻り値は "for=" + f + ",do=" + d + ",inf=" + e の形にする

入出力例

count(0)"for=0,do=1,inf=1" count(3)"for=3,do=3,inf=3" count(1)"for=1,do=1,inf=1"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.java
学習モード

メモ

ループの罠

⌘S で保存