代入演算子(単純代入・複合代入・final再代入のコンパイル可否)難易度 標準無料
次の4つの独立したコードスニペットのうち、コンパイルが通るものをすべて選べ(複数選択)。
- A
int x = 10; x += 3.5; System.out.println(x); - B
int x = 10; x = x + 3.5; System.out.println(x); - C
byte b = 10; b++; System.out.println(b); - D
final int y = 5; y = 6; System.out.println(y);
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済
解説
代入演算子まわりのコンパイル可否は「暗黙の縮小変換が許される場面か」と「final 変数への再代入か」で決まる。
- A:
x += 3.5;は複合代入演算子。x = (int)(x + 3.5)と等価に暗黙キャストされるためコンパイルが通る(xは(int)13.5 = 13)。 - B:
x = x + 3.5;は単純代入。右辺x + 3.5はdoubleになり、それをint変数へ明示キャスト無しで代入しようとするためコンパイルエラー(double→intの暗黙の縮小変換は不可)。 - C:
b++;は増分演算子。複合代入と同様に暗黙キャストが働くためbyteに対してもコンパイルが通る。 - D:
final変数への再代入はコンパイルエラー(finalは「一度だけ代入可・以後変更不可」を意味する)。
コンパイルが通るのは A と C。
- B単純代入
=には複合代入のような暗黙キャストが働かない。x + 3.5はdoubleであり、明示キャスト無しでint変数へは代入できずコンパイルエラーになる。 - D
final修飾された変数は一度初期化されると再代入できない。y = 6;の時点でコンパイルエラーになる。
ひっかけ: 複合代入演算子(
+= 等)や増分・減分演算子(++/--)は暗黙の縮小キャストという特別扱いを受けるが、単純代入(=)にはその特別扱いが無い、という非対称性が最大の引っかけ。コマンド例と想定される挙動(未実行)
検証: A) int x=10; x+=3.5; → コンパイル可・x=13 B) int x=10; x=x+3.5; → コンパイルエラー(incompatible types: possible lossy conversion from double to int) C) byte b=10; b++; → コンパイル可・b=11 D) final int y=5; y=6; → コンパイルエラー(cannot assign a value to final variable y)
公式ドキュメント・関連JLS SE11 §15.26 Assignment Operators↗
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)