请解释执行以下代码部分时究竟会发生什么:
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 位 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
该符号\nnn
表示 Java 中的八进制字符代码。因此int a = '\15'
将八进制字符 15 的自动转换值分配给a
十进制 13。
您将数字放在引号中的事实使我怀疑它将数字解释为字符文字。后面的数字必须是八进制。