转义字符在Java中的语义是什么,例如'\15'在字符字面量中的含义是什么?

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。


22
似乎它将数字解释为八进制。 - Nikhil
5
int a='\15' 首先根据八进制数"15"(十进制数13,作为一个字符,它是 ASCII 的"回车符" )创建一个 char 类型的变量,然后将其强制转换为一个 int 类型的整数。由于 chars 是16位整数,所以这是安全的上转型,没有 Java 发出关于转换的任何通知。其他答案已经涵盖了整个八进制/十进制的问题。 - Mike 'Pomax' Kamermans
3个回答

116
您已经分配了一个字符字面量,用单引号括起来,例如'a'(与由双引号括起来的字符串字面量不同,例如"a")到一个int变量。Java会自动将16位无符号char转换为32位有符号int
然而,当字符字面量是反斜杠后跟1-3个数字时,它是字符的八进制base/radix 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

3
我在3.10.1节找不到它。它在3.10.4节,字符字面值。 - Rafi Kamal
1
整数字面量部分与此无关。请参见第3.10.4节。另请参见第3.10.6节,了解字符和字符串转义序列。 - Ted Hopp
“1-3位数字”应该改为“0-3位数字”。这是针对三位八进制数的,而两位八进制数仍然可以从“0-7”中选择。例如,'\77'仍然是有效的。 - Jayamohan
6
@Jayamohan 我的意思是数量为1-3,而不是价值。 - Bohemian
@Bohemian。很好的答案。我建议您在这里添加八进制转义字面值的语法,这样会更清晰。 :) - Rohit Jain
显示剩余3条评论

19

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


5
在Java中,符号\nnn并不表示八进制数字。在OP的代码中,它表示一个八进制字符转义序列。周围的引号是必要的。然后通过赋值将该字符扩展为整数值。(八进制数由前导零位数字表示。) - Ted Hopp
好的,应该在答案中提到自动转换。已更新答案。 - BahmanM

6

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接