++a
a++
首要的区别呢,就是一个是前缀加,一个是后缀加。这个时候就会有人说了。你这不废话嘛......
额......
其实这个运算符无论位置在前还是在后,最终的结果都是使得变量a地址存放的值+1。
那么不一样的地方就是其中的过程了:
a++:先进行表达式运算,然后再进行自身值+1
++a:先进行自身值+1,再进行表达式运算
![](https://i-blog.csdnimg.cn/blog_migrate/a84c1afb53238e998173f450325feda9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9f720568a2fe56ca5201920158b9d385.png)
上述仅仅是提到a++和++a作为右值时的表达式
那么其实a++和++a在作为左值的时候又会有所不同
因为由上述现象我们可以知道a++是先进行表达式运算然后再去将自身值+1,那么这个参与表达式运算的是a本身吗?其实不是的,此时参与表达式运算的只是一个临时变量,它是临时存在的,是一份变量a自身的临时副本仅仅用于参与运算。由于它是临时存在的,并不是你程序中已定义的可寻址变量,你无法将右值赋值给它。
由于后面涉及到引用,C编译可能会误判,所以切换到C++
![](https://i-blog.csdnimg.cn/blog_migrate/4849ee543c00dbe962c9f7957027b342.png)
结果显然它不是一个可修改的左值
而++a则没有这个顾虑,因为它是先自增,然后是自身的引用参与表达式运算,引用其实就是变量a的另一个叫法,与变量a是共用同一块内存地址的,所以可以将右值赋值给它。
![](https://i-blog.csdnimg.cn/blog_migrate/6b65918f49234a68830a5f4142d45023.png)
总的来说,a++是不可以作为左值使用的,但是++a可以
a++是a的临时变量参与的表达式运算,++a是a的引用参与的表达式运算
a++参与表达式运算的值是自增之前的值,++a参与表达式运算的值是自增之后的值
另外它的结合性为右结合,也就是说++a++——>++(a++)
a++b ——> a++ b 缺乏将a++和++b运算的运算符
a++++b——>a++ ++b 也会出错,因为缺乏将a++和++b运算的运算符
a+++++b——>a++ ++ +b,这里会出错,因为a++不能作为左值,所以不能作为操作符++的对象
如有不对的地方,欢迎大家指正!