コードの次のセクションが実行されたときに何が起こるかを正確に説明してください。
int a='\15';
System.out.println(a);
これは13を出力します。
int a='\25';
System.out.println(a);
これは21を出力します。
int a='\100';
System.out.println(a);
これは64を出力します。
コードの次のセクションが実行されたときに何が起こるかを正確に説明してください。
int a='\15';
System.out.println(a);
これは13を出力します。
int a='\25';
System.out.println(a);
これは21を出力します。
int a='\100';
System.out.println(a);
これは64を出力します。
int a='\15'
最初char
に8進数「15」(10進数の13、文字として、ASCIIの「キャリッジリターン」)に基づいて作成し、次にint
整数に再キャストします。charは16ビット整数であるため、これは合法です。したがって、これは安全なアップキャストであり、キャストに関する通知はJavaによって発行されません。他の答えはすでに8進数/ 10進数のすべてをカバーしています。
回答:
たとえば、一重引用符で区切られ'a'
た文字リテラル(たとえば、二重引用符で区切られた文字列リテラルとは異なります"a"
)をint
変数に割り当てました。Javaは、16ビットの符号なしchar
から32ビットの符号付きへの自動拡張キャストを実行します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
1-3 digits
-そうあるべきだった0-3
。そして、その3桁の8進数の場合、2桁の8進数はまだから持つことができ0-7
ます。例 '\ 77'はまだ有効です。
この表記\nnn
は、Javaの8進文字コードを示します。したがってint a = '\15'
、a
10進数の13である8進数の15の自動キャスト値を割り当てます。
\nnn
は、Javaの8進数を示すものではありません。OPのコードでは、8進数の文字エスケープシーケンスを示します。周囲の引用符は必須です。次に、割り当てによって文字が整数値に拡張されます。(8進数は先行ゼロ桁で示されます。)