鱼C论坛

 找回密码
 立即注册
查看: 4346|回复: 16

简单的c语言

[复制链接]
发表于 2013-2-6 21:26:37 | 显示全部楼层 |阅读模式
1鱼币
#include <stdio.h>
void main()
{
int i=5,j=6,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d\n",p,q,i,j);
}
运行后的值是15,22,8,8  这个值怎么得来的  不理解

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-6 21:54:20 | 显示全部楼层
这是编译器优化的结果  p是先加了在自增的  q是行为 前面2个j先自增 在相加 就是7+7+8
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-6 23:03:25 | 显示全部楼层
vc++2010.jpg   


vc++6.0.jpg

vc++2010 反汇编代码

复制代码
  1. void main()
  2. {
  3. 00A813C0  push        ebp  
  4. 00A813C1  mov         ebp,esp  
  5. 00A813C3  sub         esp,0F0h  
  6. 00A813C9  push        ebx  
  7. 00A813CA  push        esi  
  8. 00A813CB  push        edi  
  9. 00A813CC  lea         edi,[ebp-0F0h]  
  10. 00A813D2  mov         ecx,3Ch  
  11. 00A813D7  mov         eax,0CCCCCCCCh  
  12. 00A813DC  rep stos    dword ptr es:[edi]  
  13.         int i=5,j=6,p,q;
  14. 00A813DE  mov         dword ptr [i],5  //把5移动到i的储存单元 ,i=5
  15. 00A813E5  mov         dword ptr [j],6  //把5移动到j的储存单元 ,j=6
  16.         p=(i++)+(i++)+(i++);
  17. 00A813EC  mov         eax,dword ptr [i]  //把i的储存单元的值放到eax  ,eax的值为5
  18. 00A813EF  add         eax,dword ptr [i]  //把i的储存单元的值取出 + eax中的值放到eax中 ,eax的值为10
  19. 00A813F2  add         eax,dword ptr [i]  //把i的储存单元的值取出 + eax中的值放到eax中 ,eax的值为15
  20. 00A813F5  mov         dword ptr [p],eax  //把eax的值放到存放p的地址储存单元  ,p=15
  21. 00A813F8  mov         ecx,dword ptr [i]  //把i的储存单元的值放到ecx ,ecx的值为5
  22. 00A813FB  add         ecx,1              //ecx的值加一 ,ecx的值为6
  23. 00A813FE  mov         dword ptr [i],ecx  //把ecx的值放到存放i的地址储存单元 ,i=6
  24. 00A81401  mov         edx,dword ptr [i]  //把i的储存单元的值放到edx ,edx的值为6
  25. 00A81404  add         edx,1              //edx的值加一 ,edx的值为7
  26. 00A81407  mov         dword ptr [i],edx  //把edx的值放到存放i的地址储存单元 ,i=7
  27. 00A8140A  mov         eax,dword ptr [i]  //把i的储存单元的值放到eax  ,eax的值为7
  28. 00A8140D  add         eax,1              //eax的值加一 ,eax的值为8
  29. 00A81410  mov         dword ptr [i],eax  //把eax的值放到存放i的地址储存单元 ,i=8
  30.         q=(++j)+(++j)+(++j);
  31. 00A81413  mov         eax,dword ptr [j]  //把j的储存单元的值放到eax  ,eax的值为6
  32. 00A81416  add         eax,1              //eax的值加一 ,eax的值为7
  33. 00A81419  mov         dword ptr [j],eax  //把eax的值放到存放j的地址储存单元 ,j=7
  34. 00A8141C  mov         ecx,dword ptr [j]  //把j的储存单元的值放到ecx , ecx的值为7
  35. 00A8141F  add         ecx,1              //ecx的值加一 ,ecx的值为8
  36. 00A81422  mov         dword ptr [j],ecx  //把ecx的值放到存放j的地址储存单元 ,j=8
  37. 00A81425  mov         edx,dword ptr [j]  //把j的储存单元的值放到edx , edx的值为8
  38. 00A81428  add         edx,1              //edx的值加一 ,edx的值为9
  39. 00A8142B  mov         dword ptr [j],edx  //把edx的值放到存放j的地址储存单元 ,j=9
  40. 00A8142E  mov         eax,dword ptr [j]  //把j的储存单元的值放到eax  ,eax的值为9
  41. 00A81431  add         eax,dword ptr [j]  //把j的储存单元的值取出 + eax中的值放到eax中 ,eax的值为18
  42. 00A81434  add         eax,dword ptr [j]  //把j的储存单元的值取出 + eax中的值放到eax中 ,eax的值为27
  43. 00A81437  mov         dword ptr [q],eax  //把eax的值放到存放q的地址储存单元  ,q=15
  44.         printf("%d,%d,%d,%d\n",p,q,i,j);
复制代码

所以在可以看出在vs2010的编译环境下编译规则是:
++放在变量后面是最后执行的 即5+5+5 = 15 之后i的值再累加三次 i=8 (6~8)
  ++放在变量前面是最先执行的,j的值先累加3次 j=9 (7~9) 然后再 9+9+9 = 27

而vc++6.0的结果也不同,这++ 后者--主要看编译器的编译原理
估计你使用是gcc或者dev
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-7 10:02:54 | 显示全部楼层
这个跟编译器有关,不同的编译器有不同的结果
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-7 14:36:44 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-7 14:45:29 | 显示全部楼层
你|若|问|我 发表于 2013-2-6 23:03
vc++2010 反汇编代码

那vc++6.0  那个q=25 是怎么出来的 是7+9+9?。。。。。高手能帮忙回答一下嘛  我是初学者呀
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-7 18:27:26 | 显示全部楼层
如果 i=2 那么 i++为2 不过++i 为 3 ……
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-7 18:30:47 | 显示全部楼层
这个不用学以后在学,你只要会i++就可以了 ,因为没个编辑器和电脑32位和64位系统的原因,得出来的结果都是不一样的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-7 20:02:25 | 显示全部楼层
我觉得以后编程时不用或少用
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-9 11:52:18 | 显示全部楼层
这玩意 和编译器 有关 你换个软件如VS2010 或换个电脑都可能不同 我记得 好像CPU有自左向右和自右向左两种
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-9 17:36:34 | 显示全部楼层
一个先用再加,一个先加再用呗!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-9 18:26:16 | 显示全部楼层
和编译器有关,另外和优化选项也有关系
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-12 16:21:53 | 显示全部楼层
我觉得这种问题还是不要研究了,你真编程的时候,这种代码会造成可读性严重下降。。能分开写还是分开写把,不是说代码集成度越高越好。。个人见解。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-6 16:05:25 | 显示全部楼层
你|若|问|我 发表于 2013-2-6 23:03
vc++2010 反汇编代码

不错!!我喜欢这个答案
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-6 18:34:39 | 显示全部楼层
和编译器本身有关!!我的答案不是这样的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-13 21:53:27 | 显示全部楼层
杞人 发表于 2013-2-7 18:27
如果 i=2 那么 i++为2 不过++i 为 3 ……

i++ 是使用后就为3,没用就2 ++i是使用前,就为3了,可楼主的题目用这个解,好像不对!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-13 21:54:54 | 显示全部楼层
绝影&瞬风 发表于 2013-3-13 21:53
i++ 是使用后就为3,没用就2 ++i是使用前,就为3了,可楼主的题目用这个解,好像不对!!

哦,加3次,只要用一次就+3,应该是这样了!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-8 13:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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