web-dev-qa-db-ja.com

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

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

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

これは13を出力します。

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

これは21を出力します。

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

これは64を出力します。

84
VAr

'a'などの単一引用符で区切られた文字リテラル(二重引用符で区切られた文字列リテラルとは異なります。たとえば、"a")をintに割り当てました。変数。 Javaは、16ビットの符号なしcharから32ビットの符号付きintへの自動拡張キャストを実行します。

ただし、文字リテラルがバックスラッシュの後に1〜3桁の数字である場合、それは octalbase/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
116
Bohemian

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

19
Bahman Movaqar

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

6
Nikhil