printf下的“i++”和“i--”

来源:互联网 发布:网络四十禁书在线阅读 编辑:程序博客网 时间:2024/05/16 19:27

我们先来看一段程序代码

#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。
阅读全文
0 0
原创粉丝点击