字符文本中转义数字的 Java 语义是什么,例如 '\15' ?

2022-08-31 12:00:12

请解释执行以下代码部分时究竟会发生什么:

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

这打印出13;

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

这打印出21;

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

这将打印出64。


答案 1

您已经将一个由单引号分隔的字符文本(例如,与由双引号分隔的字符串文本不同,例如)分配给变量。Java 执行从 16 位无符号到 32 位有符号的自动加宽转换。'a'"a"intcharint

但是,当字符文本是后跟 1-3 位数字的反斜杠时,它是字符的八进制基数/基数 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

答案 2

该表示法表示 Java 中的八进制字符代码。因此,将八进制字符 15 的自动强制转换值赋给十进制 13。\nnnint a = '\15'a