C++小技巧之贪婪匹配

       相信很多C/C++初学者在教科书或者考试中遇到过这样的问题,下面的代码输出值为多少:

很多人都很迷惑,三个加号在一起,到底是(a++) + b呢还是a + (++b)呢?我当时也很迷惑,自己写程序运行一遍,发现,a=1 b=1。这才知道是(a++) + b,可没几天就忘了。。。我记性不好。。。

      最近看了看Herb Sutter的Exceptional C++系列,发现有一种所谓贪婪匹配的方法可以简单的分析这一类的问题。

 

      “贪婪匹配”原则是说编译器在源码解析的时候遇到一个个的标记(token)时,会使用一种贪婪匹配算法,也就是让尽可能让一个标记包含更多的字符。

 

      按照这个原则,编译器在解析a+++b这个表达式的时候,会将前两个+号组合在一起,变成一个后置递增运算符,这样计算出来确实a=1 b=1。

 

      怎样,是不是很简单?

      简单是很简单,但也会导致一些问题,比如如下代码:

template<class Type=X<Y>>

按照常理来说,这是一个模板定义,并且模板参数含有默认参数,但贪婪算法会将最后两个>>解析成流提取操作符,从而导致编译失败。所以,如果你看过STL的源码,在这种情况下会这么写:

template<class Type=X<Y> >

>>中间加一个空格,这样编译器就不会使用贪婪算法匹配了。当然这是针对微软Visual C++系列编译器来说的。据说C++Builder没有这个问题。

 

 

      借用Exceptional C++ Style第33条的问题结束本文吧:

      如果不用空格隔开,并且注释中的不算,那么一个合法的C++程序中最多能包含多少个连续的一下字符:

      (1)&

      (2)<

      (3)|

      对于看过该书的同学们,再回顾一下,没看过的仔细考虑一下吧。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值