DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

13章63

このJavaプログラムにおける問題の解答について説明します。ここで求められているのは、配列 array の内容を逆順に出力するコードの選択です。

配列 array{1, 2, 3, 4, 5} と初期化されています。配列の長さを示す変数 xarray.length によって5に設定されています。Javaで配列のインデックスは0から始まるため、最後の要素のインデックスは4です。

それぞれの選択肢を見ていきましょう:

選択肢 D

while (0 < x) {
    x--;
    System.out.println(array[x]);
}
Enter fullscreen mode Exit fullscreen mode

このループは x が0より大きい間続きます。ループ内で最初に x-- が行われるため、x が5から1まで減少します。array[x] はインデックス4から0までの要素を逆順に出力します。これは望ましい動作です。

選択肢 E

while (0 < x) {
    System.out.println(array[--x]);
}
Enter fullscreen mode Exit fullscreen mode

こちらのループも 0 < x が真である間続きますが、出力する前に --xx をデクリメントします。これにより、x が最初の繰り返しで4から始まり、最後に0になるまで続きます。出力は array[4] から array[0] までの要素を逆順に行います。

その他の選択肢

  • 選択肢 A選択肢 Bx の初期値が配列の長さである5から始まるため、array[5] を参照しようとして ArrayIndexOutOfBoundsException を引き起こします。
  • 選択肢 C も同様に do-while ループの最初の繰り返しで array[5] を参照し、例外が発生します。

以上から、選択肢 D選択肢 E だけが正しく配列の内容を逆順に安全に出力するコードとなります。

追記

選択肢A、B、Cのコードについても、それぞれの動作を説明します。これらの選択肢がなぜ期待される逆順出力(54321)を達成しないかも解説します。

選択肢A

while (0 <= x) {
    System.out.println(array[x]);
    x--;
}
Enter fullscreen mode Exit fullscreen mode

このコードは、配列の長さ x が5から始まります。しかし、配列のインデックスは0から4までです。このため、array[5] へのアクセスは存在しないインデックスにアクセスしようとするため、ArrayIndexOutOfBoundsException という例外が発生します。最初のループでエラーが起きるため、このコードは機能しません。

選択肢B

do {
    x--;
    System.out.println(array[x]);
} while (0 <= x);
Enter fullscreen mode Exit fullscreen mode

do-while ループは、少なくとも1回はループ内のコードが実行されることが保証されています。このコードも x の初期値が5で始まるため、ループの最初の x-- で4になりますが、ループが終了するまでに x が0になった後、さらにデクリメントされ -1 になると array[-1] にアクセスしようとして同様に ArrayIndexOutOfBoundsException が発生します。

選択肢C

do {
    System.out.println(array[x]);
    x--;
} while (0 <= x);
Enter fullscreen mode Exit fullscreen mode

この do-while ループは、選択肢Bと同様に動作しますが、最初のステートメントが System.out.println(array[x]); であるため、ループが開始する前に x が5であり、これは存在しないインデックスへのアクセスを試みるため、同じく ArrayIndexOutOfBoundsException を引き起こします。

これらの選択肢は、配列のインデックス範囲外へのアクセスや、末尾のインデックスから開始しないために期待される出力を達成できません。正しい範囲内で配列要素にアクセスし、逆順で出力するには、選択肢DやEのように x の初期値をデクリメントしてから配列要素にアクセスすることが必要です。

Top comments (0)