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

??=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????????????????????????????\
到这里想必您已经看明白了,最后一个\成为一个续行符,于是这行注释吞掉了下一行代码。这个问题,我目前还未发现有什么编译环境能够正确地识别出来(语法着色无法反映三元转义符),所以一旦发生,很难检查。
悲剧版Hello world:(看到没,博客园的代码高亮也识别不出来)
#include <stdio.h>
int main()
{
    //Isn't it right??????????????????????????????/
    printf("Hello world!\n");
}
跟三元转义符相似,C++里面还有一种token替代语法,跟三元转义符相比,它们不是纯文本替换,它们自己是token的一种,可以算作对应token的别名,数量则稍微多了点:
替代的 原有的 替代的 原有的 替代的 原有的
<% { and && and_eq &=
%> } bitor | or_eq |=
<: [ or || xor_eq ^=
:> ] xor ^ not !
%: # compl ~ not_eq !=
:% ## bitand &    
这个规则不会替换字符串和注释中的符号。
三元转义符和token替代的存在最初都是为了某些非ANSI计算机文本环境存在的,虽说到现在意义已经不是很大,但是我们编程的时候还是要特别注意,不要让这些过时的语言特性变成我们代码中的地雷。

from: http://www.cnblogs.com/winter-cn/archive/2009/11/19/1606479.html

C++,那些可爱的小陷阱(三)相关推荐

  1. C++,那些可爱的小陷阱(一)

    此系列是为那些读过TC++PL或者具有类似水平的同学准备的,作为系列的第一篇以及有趣的热身,我们来看一个链接问题: D1.cpp #include <stdio.h> struct X { ...

  2. C++,那些可爱的小陷阱(二)

    这一次,是关于声明的一个小问题: #include <stdio.h> int j = 24;  int main()  {      int i = j, j;      j = 42; ...

  3. 可爱的小老鼠计算机教案,大班语言儿歌教案《小老鼠玩电脑》

    教学目标: 1.理解儿歌内容,学会说儿歌. 2.能运用手偶大胆表演儿歌. 3.体验说儿歌的乐趣. 4.让幼儿感受歌曲欢快的节奏. 5.培养幼儿的音乐节奏感,发展幼儿的表现力. 教学重点难点: 重点:理 ...

  4. ESXi与物理交换机静态链路聚合配置过程中的小陷阱

    作者:陆斌 文章来自微信公众号:平台人生 内容简介:ESXi与物理交换机之间配置静态链路聚合时,因为静态链路聚合的特点,在进行down网卡和从虚拟交换机移除网卡的操作时,可能会无法完成故障流量切换,影 ...

  5. 计算机绘画小房子教案,可爱的小房子──《画方形和圆形》教学案例

    一.教材.学情分析 本课是江苏省信息技术教材第11课<画方形和圆形>的教学内容,主要学习画椭圆.矩形.圆角矩形工具的使用方法.课本以画小房子为例,介绍了画椭圆.矩形.圆角矩形的步骤,有利于 ...

  6. 计算机可爱的企鹅教案,《可爱的小企鹅》教案

    目标: 初步了解企鹅的外形特征及生活习性. 准备: 1.制作动画片.(一群姿态不一的企鹅在南极的雪地上嬉戏) 2.企鹅头饰若干.配班教师扮大企鹅. 3.企鹅标本一个. 过程: 1.幼儿观看动画片< ...

  7. 可爱的小海豚:MySQL 数据库

    可爱的小海豚:MySQL 数据库 一.关系型数据库是什么 1.1 什么是数据库 本质上讲,数据库(Database,DB)是数据的集合,它具有统一的结构形式并存放于 统一的存储介质内,是多种应用数据的 ...

  8. 可爱的小老鼠计算机教案,中班美术《可爱的小老鼠》

    中班美术<可爱的小老鼠> 发布时间:2017-04-09 成长目标1. 能掌握正确的剪贴方法.2. 发挥想象,尝试动手制作立体卡通动物造型.3. 体验气球塑形的乐趣. 重点 能掌握正确的剪 ...

  9. 一、让LCD显示可爱的小企鹅

    一.让LCD显示可爱的小企鹅 还是先说说环境吧,处理器为S3C2410,linux的版本当然是2.6.20的.下面先说说怎样让LCD上显示出可爱的小企鹅.最直接的步骤如下(记住不要问为什么哈-_-,一 ...

最新文章

  1. uboot 如何设置网关地址_两种网络地址段,如何设置内网和外网一起上?
  2. 腾讯的人工智能大战已然打响!
  3. spring-security权限控制详解
  4. 【原】继承AbstractRoutingDataSource再通过AOP实现动态数据源切换
  5. Ch5302-金字塔【区间dp】
  6. 大蜘蛛序列号_Datacolor SpyderX 蓝蜘蛛 (红蜘蛛)校色仪 使用教程
  7. android电源管理
  8. brasb 密码自动应答
  9. 618秒杀抢不到?用Python完成毫秒级抢单,助你秒杀淘宝大单
  10. 对策《四川省本科毕业论文(设计)抽检实施细则》(二)专业能力
  11. python期权定价公式_美式期权BAW定价的Python3实现
  12. 水电图纸——简单看图-3
  13. python read()读取图片_可以python sitk.ReadImage读取列表/系列图像吗?
  14. 回顾Win10自带表情包快捷键
  15. Android程序员生活就是这么朴实无华,那真是穷的喝自来水
  16. linux下TC+HTB流量控制
  17. 分布式爬虫系统的设计与实现(SourceForge.net数据爬取)
  18. 鱼叉式网络钓鱼攻击——一份关于攻击动机、技术和预防方法的完整指南
  19. 程序员的五个开发神器助你更好的开发!
  20. 1行Python代码识别身份证信息,还能自动告警,YYDS

热门文章

  1. 规则引擎选型及应用 邴越 2017-04-27 16:31:17 浏览614 评论0 HTTPS 模块 配置 string exception void input 规则引擎 摘要: 规则引擎具体执
  2. 你能活多少岁,就让人工智能来告诉你吧
  3. “人工智能大脑”跳槽记:吴恩达所理解的智能
  4. 不热衷黄金、地产的美国人喜欢投资什么?
  5. Spring MVC源码 - 00开篇主题框架一览
  6. docker 配置加速器
  7. 注解@CrossOrigin解决跨域问题
  8. 数据结构简介以及抽象数据类型的实现
  9. python集合运算_python-集合及其运算
  10. python gevent缺点_python的flask框架结合gevent性能反而大幅度下降?