目录
1.只++,不赋值
2.++和其他运算符的结合
1.后置++(i++)
2.前++(++i)
总结
1.只++,不赋值
前置++和后置++无区别,效果一致,i++ -> i=i+1
反汇编语言内,对a++和++b的操作进行观察:
- a的值移动到eax
- add 将eax的值加1
- exa的值移动到a内
b同理。
2.++和其他运算符的结合
预备知识:
’++‘的优先级高于赋值运算符‘=’
‘++’优先级高于‘&’
以 i++ =1;
++i =1; 为例
1.后置++(i++)
先取值再加加
- 先取出 i 的值
- 1赋值给取出的 i (将亡值)
- 对 i 进行++
2.前++(++i)
- 先取出 i 的值
- 对取出的i++
- 把取出的值回写到 i 内
- 1赋值给 i(非将亡值)
在反汇编内查看:
执行以下程序,跳转到反汇编语言内进行查看
由此可见,
在前置++内(i=++a)
- a的值给eax
- 对eax+1
- eax的值给a
- ------------------------
- 这三步内把a的值回写给a:
- 先++ 后赋值
- ------------------------
- a的值给ecx
- ecx的值给i
在后置++内(i=b++)
- b的值给eax
- eax的值给i
- ------------------------
- b的值给ecx
- exc+1
- ecx的值给b
先赋值 再++
那么再来看下面的这种写法为什么不对?
++a = 10; 这样是正确的,根据上面所述,前++是把a取出来放在寄存器内先++,然后再把10赋值给a
但是 b++=10;这样是错误的,因为b++属于后置++,后置++是先赋值再++,如果先赋值的话就是把10赋值给b所在的寄存器临时空间内,并未赋值给b本身是不合法的(前置有个回写的过程,后置没有)
同理,我们可以&++a,但不是可以&b++,因为前置++本身就是a本身,可以对a取地址,而后置b++是先把临时量b取出来然后对临时量进行取地址&,是不合法的
总结
- 单独++不和其他运算符结合时,前置和后置一样
- 当和其他运算符结合时
- 前置++是先++后赋值,a=1; i=++a;//a=2,i=2;
- 后置++是先赋值再++ ,a=1; i=a++;//a=2,i=1;
- 前置++可以做左值,后置不可以
- 前置可以取地址&,后置不可以