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。

4

3 回答 3

116

您已经分配了一个由单引号分隔的字符文字,例如'a'(不同于由双引号分隔的字符串文字,例如"a")给一个int变量。Java 执行从 16 位 unsignedchar到 32 位 signed的自动扩大转换int

但是,当字符文字是反斜杠后跟 1-3 位数字时,它是字符的八进制基数/基数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
于 2013-10-01T04:40:20.797 回答
19

该符号\nnn表示 Java 中的八进制字符代码。因此int a = '\15'将八进制字符 15 的自动转换值分配给a十进制 13。

于 2013-10-01T04:40:40.993 回答
6

您将数字放在引号中的事实使我怀疑它将数字解释为字符文字。后面的数字必须是八进制。

于 2013-10-01T04:40:54.970 回答