以++操作为例,对于变量a, ++a表示取a的地址,增加它的内容,然后把值放在寄存器 中;a++表示取a的地址,把它的值装入寄存器,然后增加内存中a的值。

一般而言,当涉及表达式计算时,对这两种情况的计算过程区分如下:后置的++运算符是先将其值返回,然后其值增1;而前置的++运算符,则是先将值增1,再返回其值。

在这里声明,简单地比较前缀自增运算符和后缀自增运算符的效率是片面的,因为存在很多因素影响这个问题的答案。

内建数据类型的情况,效率没有区别。

首先考虑内建数据类型的情况:如果自增运算表达式的结果没有被使用,而是仅仅简单地用于增加一员操作数,答案是明确的,前缀法和后缀法没有任何区别,编译器的处理都应该是相同的,很难想象得出有什么编译器实现可以别出心裁地在二者之间制造任何差异。

自定义数据类型的情况,++i效率较高。

因为前缀式(++i)可以返回对象的引用,而后缀式(i++)必须返回对象的值,所以导致在大对象的时候产生了较大的复制开销,引起效率降低。因此处理使用者自定义类型(注意不是指内建类型)的时候,应该尽可能地使用前缀式递增/递减,因为它天生“体质”较佳。

a是变量,执行 (a++)+=a 语句是否合法?

为了更好地说明本题,首先引入两个概念:左值和右值。左值就是可以出现在表达式左边的值(等号左边),可以被改变,它是存储数据值的那块内存的地址,也称为变量的地址;右值是指存储在某内存地址中的数据,也称为变量的数据。左值可以作为右值,但是右值不可以是左值。

本题不合法,a++不能当做左值使用。++a可以当左值使用。++a表示取a的地址,对它的内容进行加1操作,然后把值放在寄存器中。a++表示取a的地址,把它的值装入寄存器,然后对内存中a的值执行加1操作。

所以,对于如下两种写法:

1) i++ = 5;
2) ++i = 5;

第1)种写法是错误的,第2)种写法是正确的。i++的运算结果并不是i这个变量的引用,而是一个临时变量,其值为i的值,所以无法进行i++=5运算,甚至编译器不允许对一个临时变量重新赋值,上面的表达式会引起编译错误。