什么是字符文字中的转义数字的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。
你已经给一个int
variables赋了一个由单引号分隔的字符字面值,例如'a'
(不同于用双引号分隔的string,例如"a"
)。 Java会自动扩展从16位无符号char
到32位有符号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.4:字符文字
- 3.10.6:字符和string文字的转义序列
从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。
事实上,你把数字放在引号中,让我怀疑它是将数字解释为字符文字。 后面的数字必须是八进制数。