鱼C论坛

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

[已解决]初学者求解答

[复制链接]
发表于 2018-7-26 12:41:05 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>


void main()
{
    int i = 5,j=5,p,q;
    p=(i++)+(i++)+(i++);
    q=(++j)+(++j)+(++j);
    printf("%d,%d,%d,%d",i,j,p,q);
}

答案分别是 8 8 15 22   

明白为什么是15 不明白其他三个
最佳答案
2018-7-26 14:00:32
1.png
2.png

  1.         int i = 5, j = 5, p, q;
  2. 01014D3E C7 45 F8 05 00 00 00 mov         dword ptr [i],5  
  3. 01014D45 C7 45 EC 05 00 00 00 mov         dword ptr [j],5  
  4.         p = (i++) + (i++) + (i++);
  5. 01014D4C 8B 45 F8             mov         eax,dword ptr [i]  
  6. 01014D4F 03 45 F8             add         eax,dword ptr [i]  
  7. 01014D52 03 45 F8             add         eax,dword ptr [i]  
  8. 01014D55 89 45 E0             mov         dword ptr [p],eax  
  9. 01014D58 8B 4D F8             mov         ecx,dword ptr [i]  
  10. 01014D5B 83 C1 01             add         ecx,1  
  11. 01014D5E 89 4D F8             mov         dword ptr [i],ecx  
  12. 01014D61 8B 55 F8             mov         edx,dword ptr [i]  
  13. 01014D64 83 C2 01             add         edx,1  
  14. 01014D67 89 55 F8             mov         dword ptr [i],edx  
  15. 01014D6A 8B 45 F8             mov         eax,dword ptr [i]  
  16. 01014D6D 83 C0 01             add         eax,1  
  17. 01014D70 89 45 F8             mov         dword ptr [i],eax  
  18.         q = (++j) + (++j) + (++j);
  19. 01014D73 8B 45 EC             mov         eax,dword ptr [j]  
  20. 01014D76 83 C0 01             add         eax,1  
  21. 01014D79 89 45 EC             mov         dword ptr [j],eax  
  22. 01014D7C 8B 4D EC             mov         ecx,dword ptr [j]  
  23. 01014D7F 83 C1 01             add         ecx,1  
  24. 01014D82 89 4D EC             mov         dword ptr [j],ecx  
  25. 01014D85 8B 55 EC             mov         edx,dword ptr [j]  
  26. 01014D88 83 C2 01             add         edx,1  
  27. 01014D8B 89 55 EC             mov         dword ptr [j],edx  
  28. 01014D8E 8B 45 EC             mov         eax,dword ptr [j]  
  29. 01014D91 03 45 EC             add         eax,dword ptr [j]  
  30. 01014D94 03 45 EC             add         eax,dword ptr [j]  
  31. 01014D97 89 45 D4             mov         dword ptr [q],eax  
复制代码


也就是说,我的编译器是这样做的
  1. p = i + i + i;
  2. i += 1;
  3. i += 1;
  4. i += 1;

  5. j += 1;
  6. j += 1;
  7. j += 1;
  8. q = j + j + j;
复制代码


3.png
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         {
  5.                 int i = 5, j = 5, p, q;
  6.                 p = (i++) + (i++) + (i++);
  7.                 q = (++j) + (++j) + (++j);
  8.                 printf("%d,%d,%d,%d\n", i, j, p, q);
  9.         }
  10.         {
  11.                 int i = 5, j = 5, p, q;
  12.                
  13.                 p = i + i + i;
  14.                 i += 1;
  15.                 i += 1;
  16.                 i += 1;

  17.                 j += 1;
  18.                 j += 1;
  19.                 j += 1;
  20.                 q = j + j + j;

  21.                 printf("%d,%d,%d,%d\n", i, j, p, q);
  22.         }

  23.         return 0;
  24. }
复制代码



  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int i = 5, j = 5, p, q;
  5.         p = (i++) + (i++) + (i++);
  6.         q = (++j) + (++j) + (++j);
  7.         printf("%d,%d,%d,%d", i, j, p, q);

  8.         return 0;
  9. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-7-26 13:12:11 | 显示全部楼层
i 和 j 最终都是自增3次,当然都为8
置于q,大概如下:
q=((++j)+(++j))+(++j)
j是前置++,初始为5,先运算两个,j变成7,得
q=(7+7)+(++j) == 14+8 ==22
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-26 13:49:39 | 显示全部楼层
BngThea 发表于 2018-7-26 13:12
i 和 j 最终都是自增3次,当然都为8
置于q,大概如下:
q=((++j)+(++j))+(++j)

不应该是6+7+8吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-26 13:52:10 | 显示全部楼层

++是前置,先执行再求和
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-26 13:57:02 | 显示全部楼层
BngThea 发表于 2018-7-26 13:52
++是前置,先执行再求和

那样的话不应该是都先变成8在求和吗 新手问题多 麻烦了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-26 14:00:32 | 显示全部楼层    本楼为最佳答案   
1.png
2.png

  1.         int i = 5, j = 5, p, q;
  2. 01014D3E C7 45 F8 05 00 00 00 mov         dword ptr [i],5  
  3. 01014D45 C7 45 EC 05 00 00 00 mov         dword ptr [j],5  
  4.         p = (i++) + (i++) + (i++);
  5. 01014D4C 8B 45 F8             mov         eax,dword ptr [i]  
  6. 01014D4F 03 45 F8             add         eax,dword ptr [i]  
  7. 01014D52 03 45 F8             add         eax,dword ptr [i]  
  8. 01014D55 89 45 E0             mov         dword ptr [p],eax  
  9. 01014D58 8B 4D F8             mov         ecx,dword ptr [i]  
  10. 01014D5B 83 C1 01             add         ecx,1  
  11. 01014D5E 89 4D F8             mov         dword ptr [i],ecx  
  12. 01014D61 8B 55 F8             mov         edx,dword ptr [i]  
  13. 01014D64 83 C2 01             add         edx,1  
  14. 01014D67 89 55 F8             mov         dword ptr [i],edx  
  15. 01014D6A 8B 45 F8             mov         eax,dword ptr [i]  
  16. 01014D6D 83 C0 01             add         eax,1  
  17. 01014D70 89 45 F8             mov         dword ptr [i],eax  
  18.         q = (++j) + (++j) + (++j);
  19. 01014D73 8B 45 EC             mov         eax,dword ptr [j]  
  20. 01014D76 83 C0 01             add         eax,1  
  21. 01014D79 89 45 EC             mov         dword ptr [j],eax  
  22. 01014D7C 8B 4D EC             mov         ecx,dword ptr [j]  
  23. 01014D7F 83 C1 01             add         ecx,1  
  24. 01014D82 89 4D EC             mov         dword ptr [j],ecx  
  25. 01014D85 8B 55 EC             mov         edx,dword ptr [j]  
  26. 01014D88 83 C2 01             add         edx,1  
  27. 01014D8B 89 55 EC             mov         dword ptr [j],edx  
  28. 01014D8E 8B 45 EC             mov         eax,dword ptr [j]  
  29. 01014D91 03 45 EC             add         eax,dword ptr [j]  
  30. 01014D94 03 45 EC             add         eax,dword ptr [j]  
  31. 01014D97 89 45 D4             mov         dword ptr [q],eax  
复制代码


也就是说,我的编译器是这样做的
  1. p = i + i + i;
  2. i += 1;
  3. i += 1;
  4. i += 1;

  5. j += 1;
  6. j += 1;
  7. j += 1;
  8. q = j + j + j;
复制代码


3.png
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         {
  5.                 int i = 5, j = 5, p, q;
  6.                 p = (i++) + (i++) + (i++);
  7.                 q = (++j) + (++j) + (++j);
  8.                 printf("%d,%d,%d,%d\n", i, j, p, q);
  9.         }
  10.         {
  11.                 int i = 5, j = 5, p, q;
  12.                
  13.                 p = i + i + i;
  14.                 i += 1;
  15.                 i += 1;
  16.                 i += 1;

  17.                 j += 1;
  18.                 j += 1;
  19.                 j += 1;
  20.                 q = j + j + j;

  21.                 printf("%d,%d,%d,%d\n", i, j, p, q);
  22.         }

  23.         return 0;
  24. }
复制代码



  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int i = 5, j = 5, p, q;
  5.         p = (i++) + (i++) + (i++);
  6.         q = (++j) + (++j) + (++j);
  7.         printf("%d,%d,%d,%d", i, j, p, q);

  8.         return 0;
  9. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-26 15:22:17 | 显示全部楼层
yxl015 发表于 2018-7-26 13:57
那样的话不应该是都先变成8在求和吗 新手问题多 麻烦了

就如6楼所示,每种编译器翻译的结果都可能不同
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-26 17:13:52 | 显示全部楼层
人造人 发表于 2018-7-26 14:00
也就是说,我的编译器是这样做的

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

使用道具 举报

 楼主| 发表于 2018-7-26 17:15:19 | 显示全部楼层
BngThea 发表于 2018-7-26 15:22
就如6楼所示,每种编译器翻译的结果都可能不同

好的 谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 00:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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