当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

(i++)+(i++)与(++i)+(++i)[VC/C++编程]

赞助商链接



  本文“(i++)+(i++)与(++i)+(++i)[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

与在前面:++(--)有太多让人困惑的地方,(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

关于(++i)+(++i):

后果:i=5,j=10

呼应的汇编代码为:

movl    $3, -4(%ebp)        ;3->i
leal    -4(%ebp), %eax        ;&i->eax
incl    (%eax)            ;i++,即i=4
leal    -4(%ebp), %eax        ;&i->eax
incl    (%eax)            ;i++, i=5
movl    -4(%ebp), %eax        ;i->eax, eax=5
addl    -4(%ebp), %eax        ;i+i ->eax ,eax=10
movl    %eax, -8(%ebp)        ;10->j

可见,关于VC6.0和gcc,二者的后果一致,但是gcc 3.2.2生成的汇编代码明显比VC6.0高效、简便.这大概是因为VC 6.0呈现较早的缘由吧.


  以上是“(i++)+(i++)与(++i)+(++i)[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • Win7桌面利用本领介绍
  • Win7窗口快速切换的本领
  • Win8怎么激活的办法步骤详解
  • Windows 8调整回收站大小的办法
  • Windows8常常呈现无呼应且无法关闭的问题办理办法
  • windows 2003翻开本地用户和组提醒无权限的办理办法
  • Win7系统浏览网页时翻开很慢的办理办法
  • win8 Could not load type System.ServiceModel.Activation.HttpModule 错误办理筹划
  • 若何进入Win8安全情势 Win8进入安全情势图文教程
  • 若何干闭Win8系统更改计算机的消息告诉
  • Windows Server 2012虚拟机的导入本领
  • Win7系统关闭GUI指导的办法图文步骤
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .