2013-10-01 46 views
84

请解释一下,究竟是什么,当下面的代码段执行情况:什么是字符文字中转义数字的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.

+22

看起来像是将数字解释为八进制数。 – Nikhil

+5

int a ='\ 15''首先根据八进制数字“15”(十进制13,作为char,它是ascii“回车”)创建一个char,然后重新转换为int整数。由于chars是16位整数,所以这是合法的,所以它是安全的预测,并且Java不会发布有关投射的通知。其他答案已涵盖整个八进制/十进制事物。 –

+3

[为什么'\ 117'是Java中的有效字符文字?](http://stackoverflow.com/questions/14950593/why-is-117-a-valid-character-literal-in-java) – gparyani

回答

115

您已分配字符的文本,这是由单引号分隔,例如'a'(从字符串文字,它是由双引号分隔不同,例如"a")到一个int变量。 Java会自动将范围从16位无符号的char转换为32位有符号的int

但是,如果字符文字是反斜杠后跟1-3个数字,则表示该字符是octalbase/radix8)。因此:

  • \15 = 1×8 + 5 = 13(回车;相同'\r'
  • \25 = 2×8 + 5 = 21(一个NAK炭 - 否定确认)
  • \100 = 1×64 + 0×8 + 0 = 64(@符号;相同'@'

有关字符文字的详细信息和转义序列,参见JLS部分:

引述BNF从3.10.6:

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中,字符文字 –

+1

整数文字部分是不相关的。参见[第3.10.4节](http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.4)。另请参见[第3.10.6节](http://docs.oracle。com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.6)用于字符和字符串转义序列。 –

+0

'1-3位数字' - 应该是'0-3'。它的三位数八进制数,八位数仍可以从'0-7'。恩。 '\ 77'仍然有效。 – Jayamohan

19

的符号\nnn表示Java中的八进制字符代码。因此int a = '\15'将十进制字符15的自动转换值赋值为a,它是十进制的13.

+5

符号'\ nnn'确实不_not_表示Java中的八进制数。在OP的代码中,它表示一个八进制字符转义序列。周围的引号是必不可少的。然后通过赋值将该字符扩展为整数值。 (八进制数字由前导零位数字表示。) –

+0

好点;应该在答案中提到自动投射。更新了答案。 –

6

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