文字リテラル内のエスケープされた数値のJavaセマンティクスは何ですか(例: '\ 15')?


85

コードの次のセクションが実行されたときに何が起こるかを正確に説明してください。

int a='\15';
System.out.println(a);

これは13を出力します。

int a='\25';
System.out.println(a);

これは21を出力します。

int a='\100';
System.out.println(a);

これは64を出力します。


22
数値を8進数として解釈しているようです。
Nikhil 2013年

5
int a='\15'最初charに8進数「15」(10進数の13、文字として、ASCIIの「キャリッジリターン」)に基づいて作成し、次にint整数に再キャストします。charは16ビット整数であるため、これは合法です。したがって、これは安全なアップキャストであり、キャストに関する通知はJavaによって発行されません。他の答えはすでに8進数/ 10進数のすべてをカバーしています。
Mike'Pomax 'Kamermans 2013年

回答:


116

たとえば、一重引用符で区切られ'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

3
セクション3.10.1で見つかりません。3.10.4、Character Literals
Rafi Kamal

1
整数リテラルに関するセクションは関係ありません。セクション3.10.4を参照してください。文字および文字列のエスケープシーケンスについては、セクション3.10.6も参照してください。
テッドホップ2013年

1-3 digits-そうあるべきだった0-3。そして、その3桁の8進数の場合、2桁の8進数はまだから持つことができ0-7ます。例 '\ 77'はまだ有効です。
ジャヤモハン2013年

6
@ジャヤモハン私は価値ではなく量で1-3を意味しました
ボヘミアン

@ボヘミアン。いい答えだ。ここに8進エスケープリテラルの構文を追加することをお勧めします。そうすれば、より明確になります。:)
Rohit Jain 2013年

19

この表記\nnnは、Javaの8進文字コードを示します。したがってint a = '\15'a10進数の13である8進数の15の自動キャスト値を割り当てます。


5
この表記\nnnは、Javaの8進数を示すものではありませ。OPのコードでは、8進数の文字エスケープシーケンスを示します。周囲の引用符は必須です。次に、割り当てによって文字が整数値に拡張されます。(8進数は先行ゼロ桁で示されます。)
Ted Hopp 2013年

いい視点ね; 答えの中で自動キャストについて言及すべきでした。答えを更新しました。
Bahman Movaqar 2013年

6

数字を引用符で囲んでいるという事実は、数字を文字リテラルとして解釈しているのではないかと思います。次の数字は8進数である必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.