《C++ Primer》确实给我带来了很多惊喜。
作为一本专业的具有较高门槛的"入门书",它有很多地方实在是国内的书不可及的,这不仅在于内容上的严谨,更表现在优秀的习题所带给学习者的启迪。
习题5.16
你认为为什么C++不叫做++C?
看到这个习题,顿感眼前一亮(不禁想起某些国内书籍的题目,真是平淡如水),这对于理解前自增操作与后自增操作而言着实是个好的题目。
想弄明白这个问题,就需要先理解一些基础的概念。什么是自增操作呢?
++操作符,即自增操作符。自增操作符有两种形式:前置操作和后置操作。前自增操作生成左值,在给操作数加1后返回改变后的操作数值。后自增操作生成右值,给操作数加1但返回未改变的操作数原值。
*事实上,因为C++具有操作符重载的功能,自增操作不仅仅可以表示加1
前置操作返回的是加1后的值,返回的是对象本身,所以这是左值。
后置操作返回的是加1前的值,其返回值可以近似的理解为与原操作数值相等的常量,所以是一个右值。
具体例子:
int i = 0, j;
j = ++i; // j = 1 , i = 1:prefix yields incremented value
j = i++; // j = 1 , i = 2:postfix yields unincremented value
附左值与右值的概念:
左值:可以出现在赋值操作左边的值。非const左值可读可写。
右值:可用于赋值操作的右边但不能用于左边的值。右值只能读不能写。
左值可以出现在赋值操作右端,但右值不可以出现在赋值操作左端,将后自增操作置于赋值操作左端将会出现编译错误。
另外需要注意:
由于后置操作符要返回未加1前的值作为操作的结果,所以必须要保存操作数原来的值,对于比较复杂的类型,这种额外工作可能会花费更大的代价。
建议:只有在必要时才使用后置操作符。
最后,让我们用全新的角度去审视C++的命名原因
C++之名是Rick Mascitti在1983年夏天定名的(参见The C++ Programming Language(Special Edition)1.4节),C说明它本质上是从C语言演化而来的,“++”是C语言的自增操作符。C++语言是C语言的超集,是在C语言基础上进行的扩展(引入了new、delete等C语言中没有的操作符,增加了面向对象程序设计的直接支持,等等),是先有C语言,再进行++。根据自增操作符前、后置形式的差别,C++表示对C语言进行扩展之后,还可以使用C语言的内容;而写成++C则表示无法再使用C的原始值了,也就是说C++不能向下兼容C了,这与实际情况不符。
如果以后有人问你这个问题,你会回答了吗?:)