|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
相信很多人在++i和i++的运算问题上纠结吧,我也曾纠结了半年了。在前一段时间,在论坛里发现了一位版主发的帖,是关于这个问题的。
fishc.com/dz/viewthread.php?tid=81&extra=page%3D2( 好像没权限发链接,大家自己可以链接看看)
这位版主用反汇编解释了这个问题,讲得也挺好。但是真的她说的就一定是对的吗?答案是不一定。可能很多人会觉得奇怪:难不成同样的代码还能产生不同的结果?
没错,这也是我写这篇帖子的原因。对于i++*++i+i--*--i这个式子来说,不同的编译器会使用不同的方式来编译。我用的vs2010,这是它的反汇编代码:- #include <stdio.h>
- void main()
- {
- 013834C0 push ebp
- 013834C1 mov ebp,esp
- 013834C3 sub esp,0D8h
- 013834C9 push ebx
- 013834CA push esi
- 013834CB push edi
- 013834CC lea edi,[ebp-0D8h]
- 013834D2 mov ecx,36h
- 013834D7 mov eax,0CCCCCCCCh
- 013834DC rep stos dword ptr es:[edi]
- int i=3,j=0;
- 013834DE mov dword ptr [i],3
- 013834E5 mov dword ptr [j],0
- j=i++*++i+i--*--i;
- 013834EC mov eax,dword ptr [i]
- 013834EF add eax,1
- 013834F2 mov dword ptr [i],eax
- 013834F5 mov ecx,dword ptr [i]
- 013834F8 sub ecx,1
- 013834FB mov dword ptr [i],ecx
- 013834FE mov edx,dword ptr [i]
- 01383501 imul edx,dword ptr [i]
- 01383505 mov eax,dword ptr [i]
- 01383508 imul eax,dword ptr [i]
- 0138350C add eax,edx
- 0138350E mov dword ptr [j],eax
- 01383511 mov ecx,dword ptr [i]
- 01383514 sub ecx,1
- 01383517 mov dword ptr [i],ecx
- 0138351A mov edx,dword ptr [i]
- 0138351D add edx,1
- 01383520 mov dword ptr [i],edx
- printf("%d\n",j);
- 01383523 mov esi,esp
- 01383525 mov eax,dword ptr [j]
- 01383528 push eax
- 01383529 push offset string "%d\n %d\n %d\n" (13857A0h)
- 0138352E call dword ptr [__imp__printf (13882B0h)]
- 01383534 add esp,8
- 01383537 cmp esi,esp
- 01383539 call @ILT+295(__RTC_CheckEsp) (138112Ch)
- }
- 0138353E xor eax,eax
- 01383540 pop edi
- 01383541 pop esi
- 01383542 pop ebx
- 01383543 add esp,0D8h
- 01383549 cmp ebp,esp
- 0138354B call @ILT+295(__RTC_CheckEsp) (138112Ch)
- 01383550 mov esp,ebp
- 01383552 pop ebp
- 01383553 ret
复制代码 它是先运算++i和--i,然后运算乘法和加法,最后运算i--和i++的。
同一个代码在不同的编程环境下产生不同的结果,那么这个代码可以说是无意义的。写程序就要能按照自己的意愿去让计算机做事,如果出现这种事,那就真不必要在这里纠结了,赶快舍弃这种蛋疼的东西吧。以后写程序的时候,千万不要出现这种无聊的东西,网上有一些人都在骂这种东西了。
所以纠结了许久或者是形成了这种蛋疼的印象的人赶紧放弃这种问题,它甚至连一个问题都不算,真的没必要继续搞这些无聊的东东了,有这闲工夫还不如多学学高深的程序设计。
其实网上有很多这种问题的讨论,但是可能很多人没搜过,也可能有些人看了那位版主的帖子后就觉得她是对的也没多想就接受了她的想法,所以我在这里就废话了一下。 |
评分
-
查看全部评分
|