字符文字(例如'\ 15')中转义数字的Java语义是什么?


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'首先创建一个char基于八进制数字“ 15”(十进制13,作为一个字符,它是ascii“回车”),然后将其重铸为int整数。这是合法的,因为char是16位整数,因此这是安全的方法,Java不会发布有关强制转换的通知。其他答案已经涵盖了整个八进制/十进制的内容。
Mike'Pomax'Kamermans 2013年

Answers:


116

您已为字符变量分配了一个变量'a',该字符变量由单引号引起来,例如(不同于与字符串文本由双引号引起来的,例如"a"int。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.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 digits-应该是0-3。而对于3位八进制,两位八进制仍可以从0-7。例如 '\ 77'仍然有效。
Jayamohan 2013年

6
@Jayamohan我的意思是数量是1-3,而不是价值
波西米亚

@波西米亚人。好答案。我建议您在此处添加八进制转义文字的语法,这样会更清楚。:)
Rohit Jain

19

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


5
记法\nnn没有表示Java中的八进制数。在OP的代码中,它表示八进制字符转义序列。周围的引号是必不可少的。然后通过赋值将字符扩展为整数值。(八进制数字用前导零数字表示。)
Ted Hopp

好点子; 应该在答案中提到自动播送。更新了答案。
巴赫曼·莫瓦卡

6

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.