快捷搜索:

(i++)+(i++)与(++i)+(++i)

与在前面:++(--)有太多让人利诱的地方,(i++)+(i++)与(++i)+(++i)有什么不合?为什么不合?假如从机械的角度去理解,就会豁然豁达。

先来看段法度榜样:

int main()

{

int i=3;

int j=(i++)+(i++);

//    int j=(++i)+(++i);

printf("%d,%dn",i,j);

}

(1)在VC 6.0下:

对付(i++)+(i++):

结果:i=5,j=6

响应的汇编代码为(有具体注释):

8B 45 FC             mov         eax,dword ptr [ebp-4]   ;i->eax

03 45 FC             add         eax,dword ptr [ebp-4]    ;i+i=6

89 45 F8             mov         dword ptr [ebp-8],eax    ;6->j

8B 4D FC             mov         ecx,dword ptr [ebp-4]    ;i->ecx(=3)

83 C1 01             add         ecx,1                           ;ecx=4

89 4D FC             mov         dword ptr [ebp-4],ecx    ;4->i

8B 55 FC             mov         edx,dword ptr [ebp-4]    ;i->edx

83 C2 01             add         edx,1                           ;edx=5

89 55 FC             mov         dword ptr [ebp-4],edx    ;5->i

对付(++i)+(++i):

结果:i=5,j=10

响应的汇编代码为:

8B 45 FC             mov         eax,dword ptr [ebp-4]    ;i->eax (=3)

83 C0 01             add         eax,1                           ;eax=4

89 45 FC             mov         dword ptr [ebp-4],eax    ;4->i

8B 4D FC             mov         ecx,dword ptr [ebp-4]    ;i->ecx

83 C1 01             add         ecx,1                           ;ecx=5

89 4D FC             mov         dword ptr [ebp-4],ecx    ;5->i

8B 55 FC             mov         edx,dword ptr [ebp-4]    ;i->edx

03 55 FC             add         edx,dword ptr [ebp-4]    ;edx=10 ,即i+i

89 55 F8             mov         dword ptr [ebp-8],edx    ;10->j

(2)在gcc 3.2.2下:

对付(i++)+(i++):

结果:i=5,j=6响应的汇编代码为:

c7 45 fc 03 00 00 00     movl    $3, -4(%ebp)        ;3->i

8b 55 fc        movl    -4(%ebp), %edx        ;i->edx (=3)

8b 45 fc        movl    -4(%ebp), %eax        ;i->eax    (=3)

8d 04 10         leal    (%eax,%edx), %eax     ;i+i=6 ->eax

89 45 f8        movl    %eax, -8(%ebp)        ;6->j

8d 45 fc        leal    -4(%ebp), %eax        ;&i->eax

ff 00            incl    (%eax)            ;i++ ,即i=4,留意这里为寄存器间接寻址

8d 45 fc        leal    -4(%ebp), %eax        ;&i->eax

ff 00            incl    (%eax)                ;i++,即i=5

您可能还会对下面的文章感兴趣: