> 文章列表 > 前++与后++的区别?反汇编底层刨析

前++与后++的区别?反汇编底层刨析

前++与后++的区别?反汇编底层刨析

目录

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++)

先取值再加加

  1. 先取出 i 的值
  2. 1赋值给取出的 i (将亡值)
  3. 对 i 进行++

2.前++(++i)

  1. 先取出 i 的值
  2. 对取出的i++
  3. 把取出的值回写到 i 内
  4. 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;
    • 前置++可以做左值,后置不可以
    • 前置可以取地址&,后置不可以