コードの次のセクションが実行されたときに何が起こるかを正確に説明してください。
int a='\15';
System.out.println(a);
これは 13 を出力します。
int a='\25';
System.out.println(a);
これは 21 を出力します。
int a='\100';
System.out.println(a);
これは64を出力します。
'a'
一重引用符で区切られた文字リテラル (例: などの二重引用符で区切られた文字列リテラルとは異なります"a"
) をint
変数に割り当てました。Java は、16 ビットの unsignedchar
から 32 ビットの signed への自動拡張キャストを行いint
ます。
ただし、文字リテラルがバックスラッシュの後に 1 ~ 3 桁の数字が続く場合、文字の8 進数(基数/基数8) 表現になります。したがって:
\15
= 1×8 + 5 = 13 (改行; と同じ'\r'
)\25
= 2×8 + 5 = 21 (NAK 文字 - 否定応答)\100
= 1×64 + 0×8 + 0 = 64 (@記号; と同じ'@'
)文字リテラルとエスケープ シーケンスの詳細については、JLS セクションを参照してください。
3.10.6 からのBNFの引用:
OctalEscape:
\ OctalDigit
\ OctalDigit OctalDigit
\ ZeroToThree OctalDigit OctalDigit
OctalDigit: one of
0 1 2 3 4 5 6 7
ZeroToThree: one of
0 1 2 3
表記\nnn
は Java の 8 進文字コードを表します。したがってint a = '\15'
、8 進文字 15 の自動キャストされた値a
が 10 進 13 に割り当てられます。
数字を引用符で囲んでいるという事実は、数字を文字リテラルとして解釈していると思われます。後続の数字は 8 進数でなければなりません。