多语言展示
当前在线:1644今日阅读:27今日分享:41

探究++a与a++的区别到底在哪

我在百度知道回答过这个问题,不过当时回答的不是很详细,而且也不是很准确。本文在相关代码的反汇编代码基础上,详细剖析了++a与a++的区别,看完后你会明白其所以然。工具列出的比较详细,你可以动手操作,也无需动手操作,看看文章即可。
工具/原料

windows7+QtCreator+Qt5.5.1+GCC 4.9.2+GDB 7.8.1

方法/步骤
1

先来看看要研究的代码,很简单的。

2

QtCreator中下断,然后进入反汇编模式看看反汇编代码。如果您不知道怎么进入反汇编模式,请参考我的另一篇经验。

3

Debug模式下的反汇编,很简单很清晰。下面来进行分析:int a=5,b=0,c=0,d=0;下面的图片是变量初始化代码,可以看到局部变量存储空间都是开辟在栈中的。

4

在反汇编界面,按F10单步运行到第13行,可以在监视窗口看到,各变量都初始化完毕。您可以在单步调试时观察监视窗口,可以看到每个变量的值的变化。

5

下面来看看b=++a运行过程。在反汇编界面,单步调试到第17行的过程中可以看到变量a和变量b的变化,以及寄存器窗口中eax寄存器的变化。从反汇编代码中可以看到b=++a的运行方式与我们想的一样,给变量a加上1后直接赋值给了b。

6

看看c=a++的运行过程。可以看到,先将a的值也就是6保存在eax寄存器中,然后将a的值加1,此时a已经是7了。但是赋给c的值却不是a,而是eax寄存器保存的值,也就是6。在反汇编界面进行单步调试时,要注意变量a和c的变化,尤其是eax和edx寄存器的变化。反汇编代码中要注意第20行,注意到底是谁的值赋值给了c。

7

看看d=a的运行过程。图片中说的比较清楚了。

8

看看最终运行的结果:a==7b==6c==6d==7显然c的值并不是b的值加1。这里反应出了++a和a++的区别。

结论
1

对于b=++a,编译器是将a加1后直接赋值给b

2

对于c=a++,编译器是先将a的值保存在一个临时变量中,本文是eax寄存器,然后将a加1,最后将临时变量的值赋值给c。结果就是c中是a原来的值,而a已经加了1。

3

根据c=a++的运行过程,我们可以把它等价于下面的代码:tmp=a;++a;c=tmp;

注意事项

本文的结果仅限于c++或c,对于其他语言,作者未作验证,请参考本文自行研究。

推荐信息