在Java中使用转义序列打印八进制字符

7
请解释下面的代码:
public class Example{
   public static void main(String[] args)
   {
      int i[]={9};
       System.out.println("\700");
   }
}

请不要告诉我八进制值应该小于377。我已经知道了,但是当我运行上面的程序时,输出结果为80。我想知道为什么会发生这种情况?
请给出清晰的解释。谢谢。

7
"\700" 等于 "\70" 加上 "0",即 "8" 加上 "0",结果为 "80"。 - Phylogenesis
感谢 @Phylogenesis - prathapa reddy
1个回答

9
基本上,你有两个字符: '\70''0'
八进制的转义序列在JLS文件中有记录
OctalEscape:
\ OctalDigit 
\ OctalDigit OctalDigit 
\ ZeroToThree OctalDigit OctalDigit 

在您的情况下,最后一个不适用,因为“7”不在ZeroToThree中,但是“7”和“0”都是八进制数字,所以它匹配第二个模式。
因此,现在我们只需要知道为什么'\70'是'8'...那是因为八进制70是十进制56或十六进制38,这是UTF-16代码单元“8”的

1
只是一个小问题,Jon,我认为它不是UTF-16代码点,而是Unicode代码点。UTF-16只是Unicode代码点的一种编码方法。 - paxdiablo
1
@paxdiablo: 我实际上是指UTF-16代码单元(已在答案中修正)-这比Unicode代码点更相关,因为char是一个UTF-16代码单元。(特别地,字符串应该被视为UTF-16代码单元序列,在charAtlength等方面。可能会有比代码单元更少的代码点...) - Jon Skeet

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