设为首页 加入收藏

TOP

C++那些可爱的小陷阱
2014-11-22 13:00:26 】 浏览:3627
Tags:那些 可爱 陷阱

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


   =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++的三元转义符,所幸它们数量不多,请看下表:



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


  //Is it necessary /


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


  //Is it necessary \


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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇替换EXE文件图标为硬盘上的ICO文件 下一篇理解boost::bind的实参传递方式

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目