[C语言]小记q = (++j) + (++j) + (++j)的值

根据不同的编译器,生产的代码不一样,导致的结果也会不一样。

 

代码如下:

1 #include <stdio.h>
2 void main()
3 {
4 int j = 5;
5 int q;
6 q =(++j)+(++j)+(++j);
7 }

 

环境:win7

编译器:GCC

IDE:vc++6.0  /DEV-C++

结果:q = 22

 1 6:    q =(++j)+(++j)+(++j);
 2 00401036   mov         eax,dword ptr [ebp-8]           移动J=5到寄存器eax内
 3 00401039   add         eax,1                                       在寄存器eax值上加1,eax=6
 4 0040103C   mov         dword ptr [ebp-8],eax          把寄存器的值移动到变量j上去,j= 6
 5 0040103F   mov         ecx,dword ptr [ebp-8]           移动J=6到寄存器ecx
 6 00401042   add         ecx,1                                       在寄存器上ecx+1,j=6
 7 00401045   mov         dword ptr [ebp-8],ecx          把寄存器ecx上的值移到J上去,J=7
 8 00401048   mov         edx,dword ptr [ebp-8]         把J=7移动到寄存器edx=7
 9 0040104B   add         edx,dword ptr [ebp-8]          edx值+j  此时j=7,edx=7+7
10 0040104E   mov         eax,dword ptr [ebp-8]          把j=7Move给 第一个寄存器eax
11 00401051   add         eax,1                                       eax再加1,此时寄存器eax=8
12 00401054   mov         dword ptr [ebp-8],eax          把此时的eax的值move给 j=8
13 00401057   add         edx,dword ptr [ebp-8]           edx值= edx+j = 14+8
14 0040105A   mov         dword ptr [ebp-0Ch],edx      edx值 move给 j = 22 

 

 环境:win7

编译器:GCC

IDE: VC++ 2008

运行结果:24

 1  q =(++j)+(++j)+(++j);
 2 003A1815  mov         eax,dword ptr [j]   //eax = 5,j = 5
 3 003A1818  add         eax,1   //eax = 6
 4 003A181B  mov         dword ptr [j],eax  j = 6 
 5 003A181E  mov         ecx,dword ptr [j]  ecx = 6
 6 003A1821  add         ecx,1  ecx = 7
 7 003A1824  mov         dword ptr [j],ecx  j = 7 
 8 003A1827  mov         edx,dword ptr [j]   edx = 7
 9 003A182A  add         edx,1   edx = 8
10 003A182D  mov         dword ptr [j],edx   j = 8 
11 003A1830  mov         eax,dword ptr [j] eax = 8
12 003A1833  add         eax,dword ptr [j] eax = 16
13 003A1836  add         eax,dword ptr [j]  eax = 24
14 003A1839  mov         dword ptr [q],eax 

 

posted @ 2013-07-10 12:00  Anleb  阅读(6748)  评论(12编辑  收藏  举报