加入收藏 收藏网站 设为首页 设为首页
招生考试网
学历类| 阳光高考 研 究 生 自学考试 成人高考 专 升 本 中考会考 外语类| 四 六 级 职称英语 商务英语 公共英语 日语能力
资格类| 公 务 员 报 关 员 银行从业 司法考试 导 游 证 教师资格 财会类| 会 计 证 经 济 师 会计职称 注册会计 税 务 师
工程类| 一级建造 二级建造 造 价 师 造 价 员 咨 询 师 监 理 师 医学类| 卫生资格 执业医师 执业药师 执业护士 国际护士
计算机| 等级考试 软件水平 应用能力 其它类| 书画等级 美国高考 驾 驶 员 书法等级 少儿英语 报 检 员 单 证 员 出国留学
 招生考试网 - 计算机等级考试 - 考试辅导 - 正文

 
C++的小陷阱
来源:fjzsksw.com 2009-11-24 编辑:yangmeiling 【字体:小 大】

我们沿袭忠于标准的传统,还是首先来看一个标准中的例子

  ??=define arraycheck(a,b) a??(b??) ??!??! b??(a??)

  这真是一段XE的代码,你看懂什么意思了么?好吧这次厚道点立刻上答案:

  #define arraycheck(a,b) a[b] || b[a]

  这个代码尽管是用来演示三元转义符的,但是我看到这个宏定义暗示另一个非常古怪的语法,在没有重载[]运算符的情况下,a[b]和b[a]总是完全等价的。所以在任何你使用了a[1]的时候,你都可以替换成1[a],尽管这看起来非常诡异。似乎这一点颇得标准编写者的喜爱,居然在一个完全无关的场合明里暗里地提了一下这个事情。

  好吧我们言归正传,这些诡异的用法是C++的三元转义符,所幸它们数量不多,请看下表:

三元符 用以替代 三元符 用以替代 三元符 用以替代
??= # ??( [ ??< {
??/ \ ??) ] ??> }
??' ^ ??! | ??- ~
  注意一点我们的例子是一个宏定义,这很好地说明了三元转义符是在编译过程的最开始处理,它的优先权也是最高的,不论在任何位置(包括注释和字符串中)三元符都会被转义。也许记忆所有转义有些困难,但是编写C++时注意两个问号相连的情况就可以安全了。

  关于三元转义符有个悲情的故事,(本故事根据Exceptional C++某段改编)故事讲的是某粗心的软件工程师在写注释的时候留了一个问题:Is it necessary?由于他想要加强语气他决定多写些问号,于是他按住shift和?键,但是很遗憾他shift松得早了一点,最后一个?就变成了/(看看你的键盘就明白了)于是他的注释变成了:

  //Is it necessary??????????????????????????????/

  这看起来再正常不过了,注释里的文字错误又不会有什么影响,然而??/却是一个三元符,于是转义之后注释变成了:

  //Is it necessary????????????????????????????\

  到这里想必您已经看明白了,最后一个\成为一个续行符,于是这行注释吞掉了下一行代码。这个问题,我目前还未发现有什么编译环境能够正确地识别出来(语法着色无法反映三元转义符),所以一旦发生,很难检查。



 
网站版权与免责声明
①由于各方面情况的不断调整与变化,本网所提供的相关信息请以权威部门公布的正式信息为准.
②本网转载的文/图等稿件出于非商业性目的,如转载稿涉及版权等问题,请在两周内来电联系.
最新文章
热门文章

报名考试
全国 | 黑龙江 | 吉林 | 辽宁 | 内蒙古
青海 | 宁夏 | 甘肃 | 新疆 | 陕西
西藏 | 北京 | 天津 | 河北 | 山东
江苏 | 安徽 | 河南 | 上海 | 浙江
福建 | 广东 | 山西 | 湖南 | 湖北
江西 | 广西 | 海南 | 云南 | 贵州
四川 | 重庆
分省高校计算机考试
黑龙江 | 吉林 | 辽宁 | 内蒙古 | 河北
北京 | 天津 | 新疆 | 甘肃 | 宁夏
青海 | 陕西 | 山西 | 河南 | 山东
江苏 | 安徽 | 浙江 | 福建 | 广东
海南 | 广西 | 江西 | 湖北 | 湖南
四川 | 上海 | 重庆 | 贵州 | 云南
西藏
成绩查询
报考指南
试题答案
模拟试题
考试辅导
计算机一级 | 计算机二级 | 计算机三级 | 计算机四级
经验交流
高校计算机