转义序列八进制表示法未按预期工作

时间:2017-12-29 19:31:30

标签: java

class A {
    public static void main(String args[]) {
        char c= '\777';
        System.out.println(c);
    }
}

这给出了编译错误(在Java 8编译器上运行)。

转义序列的

八进制表示法的格式为' \ xxx'但在上述情况下它不起作用,char c =' \ 077'正在努力。

这可能是什么原因?

3 个答案:

答案 0 :(得分:2)

JLS, Section 3.10.6,“字符和字符串文字的转义序列”,指出八进制char字面值最多可以是3个八进制数字,如果有3个数字,那么第一个数字是有限的到0-3。

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

最大\377是十进制的255,所以看起来这样做是为了使值适合一个(无符号)字节。

答案 1 :(得分:2)

因为八进制转义序列只能指定1字节字符值,而八进制777是十进制511,即超出1字节值的范围。

正如Java语言规范3.10.6. Escape Sequences for Character and String Literals所说:

  

提供了与C 的兼容性的八进制转义,但只能表示\u0000\u00FF的Unicode值,因此通常首选 Unicode转义

八进制转义的完整规范是:

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

如您所见,最大允许八进制数为377

答案 2 :(得分:1)

八位字符可以从0377(以十六进制:0x000xFF)。

为了超越这个范围,您需要使用代表基于Unicode的十六进制的\uXXXX表示法。

关于Character的Java文档非常lengthy,并提供了有关此主题的大量信息。

对于您的特定示例,我认为您想要执行以下操作:

public  class A {
    public static void main(String args[]) {
        char c= '\u0777';
        System.out.println(c);
    }
}