我们先来看一段程序代码
#include <stdio.h>
void main()
{
int i = 0;
printf("%d %d %d", i++, i--, i++);
}
以我们以往的思路分析出来结果应该是0 0 0,但是程序运行出来的结果不是这样的,而是0 1 0。这是为什么呢,我们首先看一下它的汇编代码,看它究竟是如何运行的。
009913E5 mov eax,dword ptr [i]
009913E8 mov dword ptr [ebp-0D0h],eax
009913EE mov ecx,dword ptr [i]
009913F1 add ecx,1
009913F4 mov dword ptr [i],ecx
009913F7 mov edx,dword ptr [i]
009913FA mov dword ptr [ebp-0D4h],edx
00991400 mov eax,dword ptr [i]
00991403 sub eax,1
00991406 mov dword ptr [i],eax
00991409 mov ecx,dword ptr [i]
0099140C mov dword ptr [ebp-0D8h],ecx
00991412 mov edx,dword ptr [i]
00991415 add edx,1
00991418 mov dword ptr [i],edx
0099141B mov esi,esp
0099141D mov eax,dword ptr [ebp-0D0h]
00991423 push eax
00991424 mov ecx,dword ptr [ebp-0D4h]
0099142A push ecx
0099142B mov edx,dword ptr [ebp-0D8h]
00991431 push edx
由于编译器是从后往前压参数的,所以我们首先看最后一个“i++”,由汇编代码可以看出编译器编译这一行代码时首先将内存上i的值0赋给寄存器,然后将寄存器的值0赋给临时变量,就成为这种情况:
寄存器 0
临时量 0
此时输出寄存器上面的值0。
其次是中间的“i--”,输出0之后对临时变量的值进行i++后临时量的值变为了1,我们将临时量的值1赋给寄存器,此时的情况为:
寄存器 1
临时量 1
此时输出寄存器上面的值1.
最后是第一个“i++”,输出1之后对临时变量的值进行i-- 后临时变量的值变为了0,将临时变量的值0赋给寄存器,此时的情况:
寄存器 0
临时量 0
此时输出寄存器上的值0。