[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 

 

你可能感兴趣的:(C语言)