代入演算子(複合代入演算子の暗黙の縮小変換)難易度 標準無料
次のコードの出力として正しいものを選べ。
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 }
- A
15 - Bコンパイルエラー(
intの結果をbyte変数に複合代入できない) - C
ClassCastExceptionが実行時にスローされる - D
5(+=は上書き代入として働く)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済
解説
複合代入演算子 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が作成し、独立した検証を経た解説です(有資格者による監修は経ていません)