鱼C论坛

 找回密码
 立即注册
查看: 4104|回复: 14

自增语句的问题

[复制链接]
发表于 2013-6-16 09:36:53 | 显示全部楼层 |阅读模式

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

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

x

问题

问题

在视频上学习自增,除了按视频教学练习码出前面四条式子之外,我还加了第五条。结果却很让人废解
前四条说明I的变化是根据上一条式子变化的。
但第五条却没办法解释。求大神指点
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-16 10:40:29 | 显示全部楼层
表示我是菜鸟看不懂呀!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-16 10:58:00 | 显示全部楼层
  想必这个  i++   和  ++ i  的区别大家都知道
  i++ : 就是先 赋值给表达式   i  => i++  
                然后再  自身加 1 , i = i+1
  ++i  : 就是相反的    就是先自身加 1,然后再给表达式赋值。
    你说的第五条  原因是 编译器在 将参数压栈前做了处理,压栈顺序是 从右往左:
      也就是说 编译器先从优往左 把那几个表达式计算了变,然后再把值输出的:
       这个 VS2008的汇编;
  1.                 printf("%d,%d,%d,%d\n",i++,i--,++i,--i);
  2. 012B146D  mov         eax,dword ptr [i]
  3. 012B1470  sub         eax,1
  4. 012B1473  mov         dword ptr [i],eax
  5. 012B1476  mov         ecx,dword ptr [i]
  6. 012B1479  add         ecx,1
  7. 012B147C  mov         dword ptr [i],ecx
  8. 012B147F  mov         edx,dword ptr [i]
  9. 012B1482  mov         dword ptr [ebp-0D0h],edx
  10. 012B1488  mov         eax,dword ptr [i]
  11. 012B148B  sub         eax,1
  12. 012B148E  mov         dword ptr [i],eax
  13. 012B1491  mov         ecx,dword ptr [i]
  14. 012B1494  mov         dword ptr [ebp-0D4h],ecx
  15. 012B149A  mov         edx,dword ptr [i]
  16. 012B149D  add         edx,1
  17. 012B14A0  mov         dword ptr [i],edx
  18. 012B14A3  mov         esi,esp
  19. 012B14A5  mov         eax,dword ptr [i]
  20. 012B14A8  push        eax  
  21. 012B14A9  mov         ecx,dword ptr [i]
  22. 012B14AC  push        ecx  
  23. 012B14AD  mov         edx,dword ptr [ebp-0D0h]
  24. 012B14B3  push        edx  
  25. 012B14B4  mov         eax,dword ptr [ebp-0D4h]
  26. 012B14BA  push        eax  
  27. 012B14BB  push        offset string "%d,%d,%d,%d\n" (12B573Ch)
  28. 012B14C0  call        dword ptr [__imp__printf (12B82BCh)]
  29. 012B14C6  add         esp,14h
  30. 012B14C9  cmp         esi,esp
  31. 012B14CB  call        @ILT+320(__RTC_CheckEsp) (12B1145h)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-16 11:27:19 | 显示全部楼层
楼上正解   这种问题看反汇编代码最准确  最直接了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-16 12:01:26 | 显示全部楼层
这个 各种编译器得到的结果都不一样,Debug版和Release版都不一样啊.. release版直接全是 8,
不要太纠结这个问题啊
  1.                 printf("%d\n",++i);
  2. 01181019  push        9   
  3. 0118101B  push        offset string "%d\n" (11820F4h)
  4. 01181020  call        esi  
  5.                 printf("%d\n",--i);
  6. 01181022  push        8   
  7. 01181024  push        offset string "%d\n" (11820F4h)
  8. 01181029  call        esi  
  9.                 printf("%d,%d,%d,%d\n",i++,i--,++i,--i);
  10. 0118102B  push        8   
  11. 0118102D  push        8   
  12. 0118102F  push        8   
  13. 01181031  push        8   
  14. 01181033  push        offset string "%d,%d,%d,%d\n" (11820F8h)
  15. 01181038  call        esi  
  16. 0118103A  add         esp,34h
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-16 12:06:07 | 显示全部楼层

谢谢大神。终于有个解释了,不过压栈汇编都还没学到,看不懂。后面学到应该才会明白。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-16 12:36:46 | 显示全部楼层
怎么查看汇编代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-16 13:23:06 | 显示全部楼层
从右往左看就是了,各个编译不一样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-16 14:37:53 | 显示全部楼层
好像有个版主关于这问题,专门有贴子,你找找看看吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-17 10:54:24 | 显示全部楼层
nextforever 发表于 2013-6-16 10:58
想必这个  i++   和  ++ i  的区别大家都知道
  i++ : 就是先 赋值给表达式   i  => i++  
           ...

你的这个汇编代码是如何在编辑器里边看到的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-17 13:04:30 | 显示全部楼层
还是我来个你解释吧!printf的执行是从右向左……
i++是先执行所在的语句!执行完后再i+1;
++i是先执行i+1再执行所在语句!
以此类推……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-17 13:09:17 | 显示全部楼层
要他的 反汇编!在调试窗口里面的……看图片
够清楚哦了吧????
]33ECUC)2UJ)KQZ@HD90LZ9.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-17 15:50:34 | 显示全部楼层
computerwhiz 发表于 2013-6-17 13:04
还是我来个你解释吧!printf的执行是从右向左……
i++是先执行所在的语句!执行完后再i+1;
++i是先执行i ...

视频看到后面竟然有专门讲这个问题..跟你讲的一样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-17 20:28:16 | 显示全部楼层
不懂,学习一下!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-20 13:19:42 | 显示全部楼层
不懂   再去看看去
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-23 11:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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