相信很多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)|
对于看过该书的同学们,再回顾一下,没看过的仔细考虑一下吧。。。