鱼C论坛

 找回密码
 立即注册
查看: 1682|回复: 8

[已解决]j的值

[复制链接]
发表于 2020-2-11 12:02:30 | 显示全部楼层 |阅读模式

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

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

x
为什么这段代码在Liunx上编译出的j值是15,在vc2010学习版上面编译的是20,在Dev-C++上面编译的是19
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int i = 1;
  5.         int j = ++i + i++ + ++i + ++i + i++;
  6.         printf("j = %d\n",j);

  7.         return 0;
  8. }
复制代码

QQ图片20200211115959.jpg
最佳答案
2020-2-11 12:22:03
枫叶007 发表于 2020-2-11 12:10
那答案到底是多少呢

不是说了值不同,还要怎么说?我说1000你要不要
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-11 12:06:23 | 显示全部楼层
++ -- 在不同的编译器下得到的结果不一定一样。所以++ --不建议混用。
就好比不同的人对同一个事物看法不一定一样的道理。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-11 12:07:06 From FishC Mobile | 显示全部楼层
我手算是18,用手机c4droid算出来的也是18。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-11 12:10:43 | 显示全部楼层
ba21 发表于 2020-2-11 12:06
++ -- 在不同的编译器下得到的结果不一定一样。所以++ --不建议混用。
就好比不同的人对同一个事物看法不 ...

那答案到底是多少呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-11 12:11:37 | 显示全部楼层
召唤风云 发表于 2020-2-11 12:07
我手算是18,用手机c4droid算出来的也是18。

我更迷了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-11 12:22:03 | 显示全部楼层    本楼为最佳答案   
枫叶007 发表于 2020-2-11 12:10
那答案到底是多少呢

不是说了值不同,还要怎么说?我说1000你要不要
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-11 13:22:11 | 显示全部楼层
枫叶007 发表于 2020-2-11 12:10
那答案到底是多少呢

我觉得答案就是你用什么编译器,答案就是什么编译器的结果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-11 13:56:47 | 显示全部楼层
  1. 0040DEE8 C7 45 FC 01 00 00 00 mov         dword ptr [ebp-4],1       i=1
  2. 15:           int j = ++i + i++ + ++i + ++i + i++;
  3. 0040DEEF 8B 45 FC             mov         eax,dword ptr [ebp-4]
  4. 0040DEF2 83 C0 01             add         eax,1                      //eax=1+1
  5. 0040DEF5 89 45 FC             mov         dword ptr [ebp-4],eax      //ebp-4=2
  6. 0040DEF8 8B 4D FC             mov         ecx,dword ptr [ebp-4]      //ecx=2
  7. 0040DEFB 03 4D FC             add         ecx,dword ptr [ebp-4]      //ecx=2+2=4   
  8. 0040DEFE 8B 55 FC             mov         edx,dword ptr [ebp-4]      //edx=2   
  9. 0040DF01 83 C2 01             add         edx,1                      //edx=2+1=3
  10. 0040DF04 89 55 FC             mov         dword ptr [ebp-4],edx      //ebp-4=3
  11. 0040DF07 03 4D FC             add         ecx,dword ptr [ebp-4]          //ecx=4+3=7
  12. 0040DF0A 8B 45 FC             mov         eax,dword ptr [ebp-4]      //eax=3  
  13. 0040DF0D 83 C0 01             add         eax,1                      //eax=3+1=4
  14. 0040DF10 89 45 FC             mov         dword ptr [ebp-4],eax      //ebp-4=4
  15. 0040DF13 03 4D FC             add         ecx,dword ptr [ebp-4]      //ecx=7+4 =11
  16. 0040DF16 03 4D FC             add         ecx,dword ptr [ebp-4]      //ecx=11+4
  17. 0040DF19 89 4D F8             mov         dword ptr [ebp-8],ecx      //ebp-8=15
  18. 0040DF1C 8B 4D FC             mov         ecx,dword ptr [ebp-4]
  19. 0040DF1F 83 C1 01             add         ecx,1
  20. 0040DF22 89 4D FC             mov         dword ptr [ebp-4],ecx
  21. 0040DF25 8B 55 FC             mov         edx,dword ptr [ebp-4]
  22. 0040DF28 83 C2 01             add         edx,1
  23. 0040DF2B 89 55 FC             mov         dword ptr [ebp-4],edx
  24. 16:           printf("j = %d\n",j);
  25. 0040DF2E 8B 45 F8             mov         eax,dword ptr [ebp-8]
  26. 0040DF31 50                   push        eax
  27. 0040DF32 68 1C 30 42 00       push        offset string "j = %d\n" (0042301c)
  28. 0040DF37 E8 B4 32 FF FF       call        printf (004011f0)
  29. 0040DF3C 83 C4 08             add         esp,8
复制代码

这个是vc6反编译的情况


  1.                 int i = 1;
  2. 002269F8  mov         dword ptr [ebp-8],1      
  3.                 int j = ++i + i++ + ++i + ++i + i++;
  4. 002269FF  mov         eax,dword ptr [ebp-8]   // eax=1
  5. 00226A02  add         eax,1                   // eax=1+1=2
  6. 00226A05  mov         dword ptr [ebp-8],eax   //ebp-8=2
  7. 00226A08  mov         ecx,dword ptr [ebp-8]   //ecx=2
  8. 00226A0B  add         ecx,1                   //ecx=2+1=3
  9. 00226A0E  mov         dword ptr [ebp-8],ecx   //ebp-8=3
  10. 00226A11  mov         edx,dword ptr [ebp-8]   //edx=3
  11. 00226A14  add         edx,1                   //edx=3+1=4
  12. 00226A17  mov         dword ptr [ebp-8],edx   //ebp-8=4
  13. 00226A1A  mov         eax,dword ptr [ebp-8]   //eax=4
  14. 00226A1D  add         eax,dword ptr [ebp-8]   //eax=4+4=8
  15. 00226A20  add         eax,dword ptr [ebp-8]   //eax=8+4=12
  16. 00226A23  add         eax,dword ptr [ebp-8]   //eax=12+4=16
  17. 00226A26  add         eax,dword ptr [ebp-8]   //eax=16+4=20
  18. 00226A29  mov         dword ptr [ebp-14h],eax  // ebp-14=20
  19. 00226A2C  mov         ecx,dword ptr [ebp-8]  
  20. 00226A2F  add         ecx,1  
  21. 00226A32  mov         dword ptr [ebp-8],ecx  
  22. 00226A35  mov         edx,dword ptr [ebp-8]  
  23. 00226A38  add         edx,1  
  24. 00226A3B  mov         dword ptr [ebp-8],edx  
  25.                 printf("j = %d\n", j);
  26. 00226A3E  mov         eax,dword ptr [ebp-14h]  
  27.                 printf("j = %d\n", j);
  28. 00226A41  push        eax  
  29. 00226A42  push        228FF0h  
  30. 00226A47  call        00221050  
  31. 00226A4C  add         esp,8  
复制代码

这个是vs2017反编译的计算结果
综上,我觉得这个是编译器的问题,你问哪个才是结果,我个人觉得vc6是我们理解的那种
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-11 13:57:15 | 显示全部楼层
枫叶007 发表于 2020-2-11 12:10
那答案到底是多少呢

不是说了吗,这类问题没有正确答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-7 02:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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