鱼C论坛

 找回密码
 立即注册
查看: 5220|回复: 3

[技术交流] i++与++i:不是问题的问题

[复制链接]
发表于 2011-4-7 09:39:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
相信很多人在++i和i++的运算问题上纠结吧,我也曾纠结了半年了。在前一段时间,在论坛里发现了一位版主发的帖,是关于这个问题的。
fishc.com/dz/viewthread.php?tid=81&extra=page%3D2( 好像没权限发链接,大家自己可以链接看看)
这位版主用反汇编解释了这个问题,讲得也挺好。但是真的她说的就一定是对的吗?答案是不一定。可能很多人会觉得奇怪:难不成同样的代码还能产生不同的结果?
没错,这也是我写这篇帖子的原因。对于i++*++i+i--*--i这个式子来说,不同的编译器会使用不同的方式来编译。我用的vs2010,这是它的反汇编代码:
  1. #include <stdio.h>

  2. void main()
  3. {
  4. 013834C0  push        ebp  
  5. 013834C1  mov         ebp,esp  
  6. 013834C3  sub         esp,0D8h  
  7. 013834C9  push        ebx  
  8. 013834CA  push        esi  
  9. 013834CB  push        edi  
  10. 013834CC  lea         edi,[ebp-0D8h]  
  11. 013834D2  mov         ecx,36h  
  12. 013834D7  mov         eax,0CCCCCCCCh  
  13. 013834DC  rep stos    dword ptr es:[edi]  
  14.         int i=3,j=0;
  15. 013834DE  mov         dword ptr [i],3  
  16. 013834E5  mov         dword ptr [j],0  
  17.         j=i++*++i+i--*--i;
  18. 013834EC  mov         eax,dword ptr [i]  
  19. 013834EF  add         eax,1  
  20. 013834F2  mov         dword ptr [i],eax  
  21. 013834F5  mov         ecx,dword ptr [i]  
  22. 013834F8  sub         ecx,1  
  23. 013834FB  mov         dword ptr [i],ecx  
  24. 013834FE  mov         edx,dword ptr [i]  
  25. 01383501  imul        edx,dword ptr [i]  
  26. 01383505  mov         eax,dword ptr [i]  
  27. 01383508  imul        eax,dword ptr [i]  
  28. 0138350C  add         eax,edx  
  29. 0138350E  mov         dword ptr [j],eax  
  30. 01383511  mov         ecx,dword ptr [i]  
  31. 01383514  sub         ecx,1  
  32. 01383517  mov         dword ptr [i],ecx  
  33. 0138351A  mov         edx,dword ptr [i]  
  34. 0138351D  add         edx,1  
  35. 01383520  mov         dword ptr [i],edx  
  36.         printf("%d\n",j);
  37. 01383523  mov         esi,esp  
  38. 01383525  mov         eax,dword ptr [j]  
  39. 01383528  push        eax  
  40. 01383529  push        offset string "%d\n %d\n %d\n" (13857A0h)  
  41. 0138352E  call        dword ptr [__imp__printf (13882B0h)]  
  42. 01383534  add         esp,8  
  43. 01383537  cmp         esi,esp  
  44. 01383539  call        @ILT+295(__RTC_CheckEsp) (138112Ch)  
  45. }
  46. 0138353E  xor         eax,eax  
  47. 01383540  pop         edi  
  48. 01383541  pop         esi  
  49. 01383542  pop         ebx  
  50. 01383543  add         esp,0D8h  
  51. 01383549  cmp         ebp,esp  
  52. 0138354B  call        @ILT+295(__RTC_CheckEsp) (138112Ch)  
  53. 01383550  mov         esp,ebp  
  54. 01383552  pop         ebp  
  55. 01383553  ret  
复制代码
它是先运算++i和--i,然后运算乘法和加法,最后运算i--和i++的。
同一个代码在不同的编程环境下产生不同的结果,那么这个代码可以说是无意义的。写程序就要能按照自己的意愿去让计算机做事,如果出现这种事,那就真不必要在这里纠结了,赶快舍弃这种蛋疼的东西吧。以后写程序的时候,千万不要出现这种无聊的东西,网上有一些人都在骂这种东西了。
所以纠结了许久或者是形成了这种蛋疼的印象的人赶紧放弃这种问题,它甚至连一个问题都不算,真的没必要继续搞这些无聊的东东了,有这闲工夫还不如多学学高深的程序设计。
其实网上有很多这种问题的讨论,但是可能很多人没搜过,也可能有些人看了那位版主的帖子后就觉得她是对的也没多想就接受了她的想法,所以我在这里就废话了一下

点评

相当不错!  发表于 2011-5-7 02:58

评分

参与人数 1荣誉 +6 收起 理由
小甲鱼 + 6 鼓励自主研究!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-5 10:24:19 | 显示全部楼层
本帖最后由 小乌龟 于 2011-5-5 10:25 编辑

关于程序
#include <stdio.h>
void main()
{
int i=5,j=5;
int m,n;
m=(i++)+(i++)+(i++);
n=(++j)+(++j)+(++j);
printf("%d,%d\n",m,n);
}
Microsoft Visual VC++ 执行结果为:15,22.
这是个运算符优先级和结合性的问题。
m=(i++)+(i++)+(i++);()的优先级最大,先算()里面的;其次是++运算。
当执行m=3+3+3后,i的临时值被赋予8,即i=8。
n=(++j)+(++j)+(++j);同样的,++再前面时,j的值先加1,再使用,
但是Microsoft Visual VC++ 是先算前两个的值,然后再与第三个相加,
那结果就成了n=(7+7)+8=22。

da.JPG

这个真的很纠结,参考资料:《C语言深度解剖》,“百度知道”.

还有我debug这个程序怎么没出现那个汇编代码……难到我Rp有……

点评

相当不错~  发表于 2011-5-7 02:57
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-5-5 12:21:25 | 显示全部楼层
回复 小乌龟 的帖子

其实我以前测试了一下的,在vs和vc++中,那个i++或i--都是在计算结束后最后完成自加或自减的,这个没问题{:3_52:} 。但是在vs里先把++i或--i先运算了,再进行其他的运算;在vc++里的运算过程你说的是对的。
不过这个不必要深究的,一般只有那些无聊的考试喜欢出这种东西,我们写程序的时候一般不会用到,也最好不要出现,这个,不利于代码的移植。
至于你的最后一句话,我还真不明白你想说些什么。{:2_30:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-8-13 08:37:41 | 显示全部楼层
  不错不错 (*^__^*) 嘻嘻……  学习下也好(*^__^*) 嘻嘻……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-5 07:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表