C++为什么不叫++C?——浅谈前自增与后自增的区别

《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了,这与实际情况不符。 

 

如果以后有人问你这个问题,你会回答了吗?:)

posted @ 2012-02-11 21:20  麦斯威尔PLUS  阅读(3029)  评论(6编辑  收藏