<<2.演算子と制御文の目次
while文
問題3(難易度:1)                        2004年11月6日
 次をコンパイル、実行すると、結果はどうなりますか。下から選びなさい。
           int i = 5;
           while(i--) {
               System.out.print(i + " ");
           }
 
  A. 5 4 3 2 1   と出力される
  B. 4 3 2 1     と出力される
  C. 5 4 3 2 1 0 と出力される
  D. 4 3 2 1 0   と出力される
  E. コンパイルエラーになる
解説

 while文の括弧内には条件を指定します。条件とは、結果が真か偽になる式で、Javaではboolean型になります。ところが上では「i−−」とint型の式になっています。よってこれはコンパイルエラーになります。

 C言語では論理データを整数値で扱うので、上のようなコーディングができます。Javaではboolean型と数値型は明確に区別されているので気をつけましょう。CとJavaは似ていますが、オブジェクト指向以外も細かい文法で異なる部分があるので、C言語経験者は気をつけましょう。

解答 E
問題4(難易度:3)                           2004年11月6日
 次をコンパイル、実行すると、結果はどうなりますか。下から選びなさい。
           int i = 5;
           while(i-- > 0) {
               System.out.print(i + " ");
           }
 
  A. 5 4 3 2 1   と出力される
  B. 4 3 2 1     と出力される
  C. 5 4 3 2 1 0 と出力される
  D. 4 3 2 1 0   と出力される
  E. コンパイルエラーになる
解説

 今度はwhile文の括弧内「>0」が付いて、条件の形になっています。他におかしなところもないので、コンパイルエラーではなさそうです。では微妙に違う出力の中から正解を選びましょう。

 まず注目してほしいのは、条件の「−−」が変数iの後ろに付いているということです。つまり条件の判定をしてから、iの値を1だけ減らします。最初のiの値は5ですが、条件判定後1減らされて出力されるので、最初の出力は「4」になります。よって選択肢のAとCは除くことができます。

 ではBとDどちらでしょうか?違いは最後に0が出力されるかどうかです。ここで「−−」が後ろに付いていることが効いてきます。
 iがどんどん減っていって1になったとします。まず「1>0」の判定で真、iが1減らされて0になり「0」が出力されます。よって正解は0まで出力されるDです。

 ややこしいな、という方は下のような表を作ってみてはどうでしょうか。最初の繰り返し回数の列は不要ですが、繰り返し処理に突入するときの「iの値」、while文の中の条件「i>0」、−−がiの後ろにあるので、その後に「i−−後のiの値」、そして出力になります。確かに0まで出力しますね。慣れてくるとこのような表もすばやくできるようになります。

 繰り返しでどの範囲のデータを処理するかという境界条件の問題は、ときどき大きなバグとなって降りかかってきます。この問題のような、最後の0が出力されるかされないかという小さな違いにも、気を配る必要があります。

繰り返し回数 iの値 i>0 i−−後のiの値 出力内容
×
解答 D

参考 読み物Java 第6章 ぐるぐる回る 
問題5(難易度:3)                           2004年11月6日
次をコンパイル、実行すると、結果はどうなりますか。下から選びなさい。
           int i = 5;
           while(--i > 0) {
               System.out.print(i + " ");
           }
 
  A. 5 4 3 2 1   と出力される
  B. 4 3 2 1     と出力される
  C. 5 4 3 2 1 0 と出力される
  D. 4 3 2 1 0   と出力される
  E. コンパイルエラーになる
解説
 問題4との違いは、条件内の「−−」の位置です。今度は前に付いています。つまり条件の判定をする前に、iの値を1減らすことになります。減らしてから判定するのですから、どうも問題4より繰り返しの最後が早まりそうです。ということは正解はBでしょうか。表を作って確認してみましょう。

繰り返し回数 iの値 −−i後のiの値 i>0 出力内容
×
解答 B

参考 読み物Java 第6章 ぐるぐる回る 
<<2.演算子と制御文の目次次問題>>
Copyright (c) 2004 Nagi Imai All Rights Reserved..