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


public class EscapeRout{public static void main(String[] args){ // \u0022 是双引号的Unicode转义字符 System.out.println("a\u0022.length()+\u0022b".length()); } } 

对该程序的一种很肤浅的分析会认为它应该打印出26,因为在由两个双引号"a\u0022.length()+\u0022b"标识的字符串之间总共有26个字符。

稍微深入一点的分析会认为该程序应该打印16,因为两个Unicode转义字符每一个在源文件中都需要用6个字符来表示,但是它们只表示字符串中的一个字符。因此这个字符串应该比它的外表看其来要短10个字符。 如果你运行这个程序,就会发现事情远不是这么回事。它打印的既不是26也不是16,而是2。

理解这个谜题的关键是要知道:Java对在字符串字面常量中的Unicode转义字符没有提供任何特殊处理。编译器在将程序解析成各种符号之前,先将Unicode转义字符转换成为它们所表示的字符[JLS 3.2]。因此,程序中的第一个Unicode转义字符将作为一个单字符字符串字面常量("a")的结束引号,而第二个Unicode转义字符将作为另一个单字符字符串字面常量("b")的开始引号。程序打印的是表达式"a".length()+"b".length(),即2。

如果该程序的作者确实希望得到这种行为,那么下面的语句将要清楚得多:


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

更有可能的情况是该作者希望将两个双引号字符置于字符串字面常量的内部。使用Unicode转义字符你是不能实现这一点的,但是你可以使用转义字符序列来实现[JLS 3.10.6]。表示一个双引号的转义字符序列是一个反斜杠后面紧跟着一个双引号(\”)。如果将最初的程序中的Unicode转义字符用转义字符序列来替换,那么它将打印出所期望的16:


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

许多字符都有相应的转义字符序列,包括单引号(\‘)、换行(\n)、制表符(\t)和反斜线(\)。你可以在字符字面常量和字符串字面常量中使用转义字符序列。

实际上,你可以通过使用被称为八进制转义字符的特殊类型的转义字符序列,将任何ASCII字符置于一个字符串字面常量或一个字符字面常量中,但是最好是尽可能地使用普通的转义字符序列。

普通的转义字符序列和八进制转义字符都比Unicode转义字符要好得多,因为与Unicode转义字符不同,转义字符序列是在程序被解析为各种符号之后被处理的。

ASCII是字符集的最小公共特性集,它只有128个字符,但是Unicode有超过65,000个字符。一个Unicode转义字符可以被用来在只使用ASCII字符的程序中插入一个Unicode字符。一个Unicode转义字符精确地等价于它所表示的字符。

Unicode转义字符被设计为用于在程序员需要插入一个不能用源文件字符集表示的字符的情况。它们主要用于将非ASCII字符置于标识符、字符串字面常量、字符字面常量以及注释中。偶尔地,Unicode转义字符也被用来在看起来颇为相似的数个字符中明确地标识其中的某一个,从而增加程序的清晰度。

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

转载于:https://www.cnblogs.com/yuyu666/p/9840386.html

谜题14:转义字符的溃败相关推荐

  1. Java解惑 电子书

    --表达式谜题 Java 谜题 1--表达式谜题 谜题 1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数.这个方法能够正确运转 吗? public static boolean isOdd( ...

  2. 《Java解惑》系列——02字符谜题——谜题17:嗯??

    知识点: 在程序中,最后禁止使用Unicode转义字符表示ANSII字符. 问题: 牛B的Java代码,上天书: \u0070\u0075\u0062\u006c\u0069\u0063\u0020\ ...

  3. 用python解算法谜题_编程的乐趣 用Python解算法谜题

    这是一本介绍通过解决复杂谜题来学习编程的书,书中的代码用Python语言编写.与以往的编程书不同,本书将对代码功能的理解与编程语言语法和语义的理解分离开来,从解每个谜题开始,先给出解谜题的算法,随后用 ...

  4. 学好顶级算法谜题,不再为了编程而编程

    谜题趣味非凡.顶级谜题的解可没那么浅显易得,需要灵光一闪才能发现.算法谜题是指谜题的解法就是算法,解题的步骤可以被机器自动执行.算法可以用英文或者其他任何自然语言来描述,但是为了更加精确,往往会用伪代 ...

  5. java解惑你知道多少_Java解惑

    第1章 绪论 第2章 表达式之谜 谜题1:奇数性 谜题2:找零时刻 谜题3:长整除 谜题4:初级问题 谜题5:十六进制的趣事 谜题6:多重转型 谜题7:互换内容 谜题8:DOS EQUIS 谜题9:半 ...

  6. java---解惑--

    Java谜题1--表达式谜题 谜题1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数.这个方法能够正确运转吗? public static boolean isOdd(int i){  ret ...

  7. JAVA解惑你的不可能

    谜题1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数.这个方法能够正确运转吗? public static boolean isOdd(int i){ return i % 2 == 1; ...

  8. Markdown 语法 示例 字体 字号 颜色

    # markdown语法实例 1 1 markdown语法实例 [TOC] 生成目录 1 1 markdown语法实例 强调 分割线 引用 标题Setext方式 大标题 小标题 标题Atx方式 一级标 ...

  9. PYTHON-小白入门-学习顺序

    PYTHON-小白学习顺序-YD推荐 YD第一篇博文 前言--YD码砖 前言--YD专业课 ➡PYTHON--学习目录 尾声 YD第一篇博文 你好! 这是影帝第一篇博文,还望路过的朋友留下足迹,小赞大 ...

最新文章

  1. geek软件_社团秀@UNC新媒体协会@管理会计研学社@Geek社团
  2. Python ord()函数和chr()函数
  3. navicat开启mysql数据库root用户的远程访问
  4. ICCV 2021 | 模型安全不容忽视!特定样本触发器的隐形后门攻击方法
  5. JS 事件绑定的几种方式 小笔记
  6. 蚁群算法python_想要学习启发式算法?推荐你看看这个价值极高的开源项目
  7. cuda-gdb 调试python中的module/cu文件
  8. C# 使用Microsoft.Reporting打印票据
  9. ace unlck工具下载_iPhoneX如何解锁ID激活锁
  10. PHP + Apache + Mysql集成环境部署及简要教程
  11. java scene_JavaFX中场景(Scene)的意义是什么?
  12. 什么是短连接,如何用 Python 生成短连接?
  13. 苹果CMS V10后台登录验证码错误解决方法
  14. 有效缓解眼睛疲劳的小方法网站设置404页面有什么作用
  15. 三层交换机与路由器之间的区别
  16. 江湖救急笔记——计算机网络
  17. 如何让IE浏览器提示下载文件,而不是直接打开Excel文件
  18. Qt 软件开发框架(详细版)
  19. 【ORACLE】ORA-01653: unable to extend table XXXX by 128 in tablespace XXX
  20. P1486 [NOI2004]郁闷的出纳员

热门文章

  1. linux 程序读写Env分区 --- mtdparts,/dev/mtd*,mtd_debug
  2. linux导出路径path,Linux kernel 绝对路径之d_path篇【转】
  3. github php项目,12月份GitHub上最热门的PHP项目
  4. Adobe Bridge 2021中文版
  5. ObservableCollection和List的区别总结
  6. C#连接sqlserver windows 和 sqlserver 身份验证的两种连接字符串
  7. postgresql安装指南
  8. query判断值是否为空,针对前台提交数据的校验
  9. leetcode342合理运用位操作判断4的幂
  10. 【Linux导论】通过图形接口配置系统(System Configuration from the Graphical Interface)