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字符插入到源文件中。
我们来看下下面的程序,使用了两个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
- java解惑之字符之谜(谜题14)
- java解惑之字符之谜(谜题11)
- java解惑之字符之谜(谜题12)
- java解惑之字符之谜(谜题13)
- java解惑之字符之谜(谜题15)
- java解惑之字符之谜(谜题16)
- java解惑之字符之谜(谜题17)
- java解惑之字符之谜(谜题18)
- java解惑之字符之谜(谜题19)
- java解惑之字符之谜(谜题20)
- java解惑之字符之谜(谜题21)
- java解惑之字符之谜(谜题22)
- Java解惑学习有感(二)---字符之谜
- java解惑之表达式之谜(谜题1)
- java解惑之表达式之谜(谜题2)
- java解惑之表达式之谜(谜题3)
- java解惑之表达式之谜(谜题4)(
- java解惑之表达式之谜(谜题5)
- GO语言反射机制
- MyBatis指定JdbcType
- Linux必学的60个命令
- SIFT 特征提取算法总结
- 本地开发spark代码上传spark集群服务并运行(基于spark官网文档)
- java解惑之字符之谜(谜题14)
- android handler的警告Handler Class Should be Static or Leaks Occur
- jQuery 动态绑定的方法多次执行的解决jQuery(document).on(
- 笔记:Hadoop权威指南 第3章 HDFS
- 工作日志
- Android相关问题的好文章整理——温故而知新,可以为师矣
- Tachyon 的 安装部署
- hdu 2153 仙人球的残影新解法(可以利用蛇阵来解决哦!)
- 安装SQL server出现“启用windows功能NetFx3”错误