java解惑之字符之谜(谜题14)

来源:互联网 发布:网络接线盒 编辑:程序博客网 时间:2024/06/04 19:44
谜题14:转义字符的溃败


我们来看下下面的程序,使用了两个Unicode的转义字符,它们是用其十六进制代码来表示Unicode字符,那么,这个程序会打印什么呢?


public class EscapeRout{


public static void main(String[] args){


System.out.println("a\u0022.length() + \u0022b".length());


}


}


我们简单对该程序进行分析后,可能会认为这个程序应该会打印出26,因为两个双引号之间的字符串长度为26。那么,我们仔细分析一下,会发现中间有两个Unicode转义字符,而每一个Unicode转义字符在源文件中都需要用6个字符来表示,但是它们只表示字符串中的一个字符,所以又会认为这个程序应该打印出16。但运行后就会发现,程序打印出的是2。


我们需要知道的是:java对在字符串字面常量中的Unicode转义字符没有提供任何特殊处理。编译器在将程序解析成各种符号之前,先将Unicode转义字符转换成为它们所表示的字符。因此,程序中的第一个Unicode转义字符作为一个单字符字符串字面常量("),所以将两个Unicode转义字符转换后,是"a".length() + "b".length这个表达式,所以最后打印出来的是2。


那么,我们可以利用转义字符序列来达到我们希望打印的16:


System.out.println("a\".length() + \"b".length());


转义字符序列有很多,有兴趣的可以去网上查下。转义字符序列在字符字面常量和字符串字面常量中均可使用。实际上,我们可以通过使用被称为八进制转义字符的特殊类型转义字符序列,将任何ASCII字符置于一个字符串字面常量或一个字符字面常量中,但是最好是尽可能地使用普通的转义字符序列。普通的转义字符序列和八进制转义字符都比Unicode转义字符要好得多,因为与Unicode转义字符不同,在程序被解析为各种符号之后才处理转义字符序列。


总之,在字符串和字符字面常量中优先选择的是转义字符序列,而不是Unicode转义字符。Unicode转义字符可能会因为它们在编译序列中被过早地处理而引起混乱。不要使用Unicode转义字符来表示ASCII字符。在字符串字面常量和字符字面常量中,应该使用转义字符序列;对于除这些字面常量外的情况,应该直接将ASCII字符插入到源文件中。
0 0
原创粉丝点击