AI作成・AIで再検証済(有資格者監修なし)1Z0-815-JPN 対応
代入演算子(複合代入演算子の暗黙の縮小変換)難易度 標準無料

次のコードの出力として正しいものを選べ。

1  public class Q4 {
2      public static void main(String[] args) {
3          byte b = 10;
4          b += 5;
5          System.out.println(b);
6      }
7  }
  1. A15
  2. Bコンパイルエラー(int の結果を byte 変数に複合代入できない)
  3. CClassCastException が実行時にスローされる
  4. D5(+= は上書き代入として働く)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・AIで再検証済

解説

複合代入演算子 E1 op= E2 は、単なる E1 = E1 op E2 の省略形ではなく、結果を E1 の型へ自動的にキャストし直すという特別な意味を持つ(JLS §15.26.2)。等価な形は次の通り:

E1 = (T) ((E1) op (E2))

ここで T は E1(byte b)の型。b + 5 は二項数値昇格により int 演算(15)になるが、b += 5 はこれを暗黙に (byte) へキャストしてから b へ代入する。15 は byte の範囲(-128〜127)に収まるため実行時エラーにもならず、b は 15 になる。

各誤答が違う理由
  • B複合代入演算子は結果を左辺の型へ暗黙にキャストする特別な意味を持つため、byte += int はコンパイルエラーにならない。エラーになるのは b = b + 5;(単純代入)の場合。
  • C複合代入の暗黙キャストはコンパイル時に組み込まれる縮小変換であり、実行時に例外を投げるものではない(値が範囲外でも例外にはならず単に切り詰められる)。
  • D+= は「加算してから代入」であり単なる上書きではない。b の元の値10に5を加えた15になる。
ひっかけ: もし b = b + 5;(複合代入ではなく単純代入+加算)と書くと、右辺 b + 5 は int 型になり、コンパイルエラーになる(int から byte への暗黙の縮小変換は変数同士の式では許されない)。+= のような複合代入演算子だけが自動キャストという特別扱いを受ける点が Silver の典型的な引っかけ。
コマンド例と想定される挙動(未実行)
出力:
15
AIが作成し、別の手順のAIで誤りを点検した解説です(有資格者による監修は経ていません)

この問題集の作り方

  1. 問題と解説はAIが作成しています。この資格の問題に、有資格者(著者)の監修は入っていません。
  2. 各問に、公式ドキュメントの出典リンクを付けています。書いてあることは、出典に当たって確かめられます。
  3. 誤答の選択肢それぞれに、なぜ誤りなのかの理由を書いています。
  4. 誤りを見つけたら報告できます。原則として無償で訂正・削除します。
  5. 各試験の運営団体とは無関係の非公式教材です。合格を保証するものではありません。
この分野をもっと解いて、得点源に
演算子 を含む問題を分野別に演習できます。
演習する →