什么是字符文字中的转义数字的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。

你已经给一个intvariables赋了一个由单引号分隔的字符字面值,例如'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。

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