問題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の値 |
出力内容 |
1 |
5 |
○ |
4 |
4 |
2 |
4 |
○ |
3 |
3 |
3 |
3 |
○ |
2 |
2 |
4 |
2 |
○ |
1 |
1 |
5 |
1 |
○ |
0 |
0 |
6 |
0 |
× |
|
|
問題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 |
出力内容 |
1 |
5 |
4 |
○ |
4 |
2 |
4 |
3 |
○ |
3 |
3 |
3 |
2 |
○ |
2 |
4 |
2 |
1 |
○ |
1 |
5 |
1 |
0 |
× |
|
Copyright (c) 2004 Nagi Imai All Rights Reserved..