1. ホーム
  2. java

[解決済み] 文字リテラルにエスケープされた数値(例:「 \15 」)がある場合のJavaのセマンティクスを教えてください。

2023-05-11 20:42:05

質問

以下のコードを実行すると、具体的にどのようなことが起こるのか説明してください。

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桁の数字が続く場合、その文字は 8進数 ( ベース/基数 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