コードの次のセクションが実行されたときに何が起こるかを正確に説明してください。
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ビットの符号なしchar
から32ビットの符号付きint
への自動拡張キャストを実行します。
ただし、文字リテラルがバックスラッシュの後に1〜3桁の数字である場合、それは octal ( base/radius 8)文字の表現。したがって:
\15
= 1×8 + 5 = 13(キャリッジリターン。'\r'
と同じ)\25
= 2×8 + 5 = 21(NAK文字-否定応答)\100
= 1×64 + 0×8 + 0 = 64(@記号; '@'
と同じ)文字リテラルとエスケープシーケンスの詳細については、JLSセクションを参照してください。
[〜#〜] bnf [〜#〜] を3.10.6から引用:
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の自動キャスト値を10進数の13であるa
に割り当てます。
数字を引用符で囲んでいるという事実は、数字を文字リテラルとして解釈しているのではないかと思います。次の数字は8進数である必要があります。