プリミティブ型(char の算術演算と結果の暗黙拡大)難易度 高無料
次のコードのコンパイル結果として正しいものを選べ。
1 public class Q15 {
2 public static void main(String[] args) {
3 char c = 'A';
4 c = c + 1;
5 System.out.println(c);
6 }
7 }
- Aコンパイルエラー(
c + 1の結果はintになりcharへキャスト無しで代入できない) - Bコンパイル成功・実行して
Bと出力される - Cコンパイル成功・実行して
66(文字コードの数値)と出力される - Dコンパイルエラー(
char型は算術演算子+に使用できない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済
解説
char は文字コードを保持する16ビットの符号無し整数型で、算術演算子(+ など)に使うと int に二項数値昇格(binary numeric promotion)される。
c + 1 は char と int の演算であり、結果の型はint になる(値としては 'A' の文字コード65に1を足した66)。
4行目 c = c + 1; はint 型の式を char 型の変数へキャスト無しで代入しようとしており、これは縮小変換にあたるためコンパイルエラーになる。
正しく書くには c = (char) (c + 1);(明示キャスト)または c += 1;(複合代入演算子には暗黙のキャストが組み込まれている)を使う。
- B
c + 1の演算結果はintに昇格するため、キャスト無しの代入c = c + 1;はコンパイルエラーになる。実行までは到達しない。 - Cそもそもコンパイルが通らない。仮に通ったとしても
char変数のprintlnは文字として出力され、数値としては出力されない。 - D
charは数値型として算術演算に使用できる(文字コードとして加減算可能)。エラーの原因は演算自体ではなく、その結果(int)をcharへキャスト無しで代入しようとした点。
ひっかけ: 「
char に対する + 1 はそのまま char のままだろう」という思い込みが罠。算術演算の結果は int に昇格するため、単純代入 c = c + 1; はコンパイルエラーになる一方、c += 1; は複合代入演算子が暗黙に (char) キャストを行うためコンパイルが通るという非対称性が試験の定番の狙い目。コマンド例と想定される挙動(未実行)
javac でコンパイル:
Q15.java:4: error: incompatible types: possible lossy conversion from int to char
c = c + 1;
^
→ コンパイル不成立(実行に至らない)。公式ドキュメント・関連JLS SE11 §5.6.2 Binary Numeric Promotion↗
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)