QQ登录

只需一步,快速开始

搜索
鱼C论坛笔记大赛成绩公示
查看: 259|回复: 12

新人求教,关于自增自减运算符

[复制链接]
最佳答案
0 

尚未签到

发表于 2017-7-10 08:09:54 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

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

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",p,q,i,j);
}
为什么q的结果是22呢?
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 

尚未签到

 楼主| 发表于 2017-7-10 09:34:21 | 显示全部楼层
  1. #include <stdio.h>
  2. void main()
  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",p,q,i,j);
  8. }
复制代码
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
438 
累计签到:109 天
连续签到:106 天
发表于 2017-7-10 10:37:18 | 显示全部楼层
本帖最后由 ba21 于 2017-7-10 14:41 编辑


不同的编译器运算结果有差别。总的而言要看运算的优先循序。

2017-07-10_103558.png
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
145 
累计签到:489 天
连续签到:37 天
发表于 2017-7-10 10:51:32 | 显示全部楼层
  1. #include <stdio.h>

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

  9.         return 0;
  10. }
复制代码
  1. 15,24,8,8请按任意键继续. . .
复制代码


自己看吧
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4. 010C4010  xchg        ax,ax  
  5. 010C4012  push        ebp  
  6. 010C4013  mov         ebp,esp  
  7. 010C4015  sub         esp,0F0h  
  8. 010C401B  push        ebx  
  9. 010C401C  push        esi  
  10. 010C401D  push        edi  
  11. 010C401E  lea         edi,[ebp-0F0h]  
  12. 010C4024  mov         ecx,3Ch  
  13. 010C4029  mov         eax,0CCCCCCCCh  
  14. 010C402E  rep stos    dword ptr es:[edi]  
  15.         int i = 5, j = 5, p, q;
  16. 010C4030  mov         dword ptr [i],5  
  17. 010C4037  mov         dword ptr [j],5  
  18.        
  19.         p = (i++) + (i++) + (i++);
  20. 010C403E  mov         eax,dword ptr [i]  
  21. 010C4041  add         eax,dword ptr [i]  
  22. 010C4044  add         eax,dword ptr [i]  
  23. 010C4047  mov         dword ptr [p],eax  
  24. 010C404A  mov         ecx,dword ptr [i]  
  25. 010C404D  add         ecx,1  
  26. 010C4050  mov         dword ptr [i],ecx  
  27. 010C4053  mov         edx,dword ptr [i]  
  28. 010C4056  add         edx,1  
  29. 010C4059  mov         dword ptr [i],edx  
  30. 010C405C  mov         eax,dword ptr [i]  
  31. 010C405F  add         eax,1  
  32. 010C4062  mov         dword ptr [i],eax  
  33.         q = (++j) + (++j) + (++j);
  34. 010C4065  mov         eax,dword ptr [j]  
  35. 010C4068  add         eax,1  
  36. 010C406B  mov         dword ptr [j],eax  
  37. 010C406E  mov         ecx,dword ptr [j]  
  38. 010C4071  add         ecx,1  
  39. 010C4074  mov         dword ptr [j],ecx  
  40. 010C4077  mov         edx,dword ptr [j]  
  41. 010C407A  add         edx,1  
  42. 010C407D  mov         dword ptr [j],edx  
  43. 010C4080  mov         eax,dword ptr [j]  
  44. 010C4083  add         eax,dword ptr [j]  
  45. 010C4086  add         eax,dword ptr [j]  
  46. 010C4089  mov         dword ptr [q],eax  
  47.         printf("%d,%d,%d,%d", p, q, i, j);
  48. 010C408C  mov         eax,dword ptr [j]  
  49. 010C408F  push        eax  
  50. 010C4090  mov         ecx,dword ptr [i]  
  51. 010C4093  push        ecx  
  52. 010C4094  mov         edx,dword ptr [q]  
  53. 010C4097  push        edx  
  54. 010C4098  mov         eax,dword ptr [p]  
  55. 010C409B  push        eax  
  56. 010C409C  push        offset string "%d,%d,%d,%d" (010C6BCCh)  
  57. 010C40A1  call        _printf (010C1361h)  
  58. 010C40A6  add         esp,14h  

  59.         return 0;
  60. 010C40A9  xor         eax,eax  
  61. }
  62. 010C40AB  pop         edi  
  63. }
  64. 010C40AC  pop         esi  
  65. 010C40AD  pop         ebx  
  66. 010C40AE  add         esp,0F0h  
  67. 010C40B4  cmp         ebp,esp  
  68. 010C40B6  call        __RTC_CheckEsp (010C1118h)  
  69. 010C40BB  mov         esp,ebp  
  70. 010C40BD  pop         ebp  
  71. 010C40BE  ret  
复制代码
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
438 
累计签到:109 天
连续签到:106 天
发表于 2017-7-10 12:43:19 | 显示全部楼层

vc++ 6.0
2017-07-10_124151.png


  1. 8:            q = (++j) + (++j) + (++j);
  2. 0040105D   mov         ecx,dword ptr [ebp-8]
  3. 00401060   add         ecx,1
  4. 00401063   mov         dword ptr [ebp-8],ecx
  5. 00401066   mov         edx,dword ptr [ebp-8]
  6. 00401069   add         edx,1
  7. 0040106C   mov         dword ptr [ebp-8],edx
  8. 0040106F   mov         eax,dword ptr [ebp-8]
  9. 00401072   add         eax,dword ptr [ebp-8]
  10. 00401075   mov         ecx,dword ptr [ebp-8]
  11. 00401078   add         ecx,1
  12. 0040107B   mov         dword ptr [ebp-8],ecx
  13. 0040107E   add         eax,dword ptr [ebp-8]
  14. 00401081   mov         dword ptr [ebp-10h],eax
  15. 9:            printf("%d,%d,%d,%d", p, q, i, j);
  16. 00401084   mov         edx,dword ptr [ebp-8]
  17. 00401087   push        edx
  18. 00401088   mov         eax,dword ptr [ebp-4]
  19. 0040108B   push        eax
  20. 0040108C   mov         ecx,dword ptr [ebp-10h]
  21. 0040108F   push        ecx
  22. 00401090   mov         edx,dword ptr [ebp-0Ch]
  23. 00401093   push        edx
  24. 00401094   push        offset string "%d,%d" (0042201c)
  25. 00401099   call        printf (004010e0)
  26. 0040109E   add         esp,14h
复制代码
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
145 
累计签到:489 天
连续签到:37 天
发表于 2017-7-10 13:10:16 | 显示全部楼层
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
438 
累计签到:109 天
连续签到:106 天
发表于 2017-7-10 13:31:11 | 显示全部楼层

你得到的是24 ; 我这是22 不应该呀。
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
145 
累计签到:489 天
连续签到:37 天
发表于 2017-7-10 14:09:35 | 显示全部楼层
ba21 发表于 2017-7-10 13:31
你得到的是24 ; 我这是22 不应该呀。

正常
无标题.png
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
4 
累计签到:100 天
连续签到:1 天
发表于 2017-7-10 14:25:52 | 显示全部楼层
不建议用这种“折磨人”的写法,语义不明,除了考试毫无用处
更重要的是,不同编译器的翻译也有区别,导致其计算结果存在区别。
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 

尚未签到

 楼主| 发表于 2017-7-16 22:20:32 | 显示全部楼层

谢谢啦~貌似这是编译器的求值顺序问题。。它只能保证j最终是8来的。还有汇编语句看不懂
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 

尚未签到

 楼主| 发表于 2017-7-16 22:21:23 | 显示全部楼层
ba21 发表于 2017-7-10 10:37
不同的编译器运算结果有差别。总的而言要看运算的优先循序。

恩恩,貌似编译器不一样算的结果也不一样。那这种题考试遇到了怎么办呢。。。
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
438 
累计签到:109 天
连续签到:106 天
发表于 2017-7-16 22:23:09 | 显示全部楼层
沧海雨季 发表于 2017-7-16 22:21
恩恩,貌似编译器不一样算的结果也不一样。那这种题考试遇到了怎么办呢。。。

按教课老师说的来咯。不过差不多也就2种情况。
你可以在各种编译器上都试下什么结果。
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:10 天
连续签到:1 天
发表于 2017-8-10 22:49:27 | 显示全部楼层
本帖最后由 f62000 于 2017-8-10 22:50 编辑

++i 和 i++ 的意思是有差的 網路有個視頻你看看有沒有幫助

  1. https://www.youtube.com/watch?v=N15wBr9DQwI&list=PLLUsl4SYy5wFtX-VCW5gft6SgLbVOH2Y5&index=5
复制代码
擷取.JPG
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋手机版Archiver( 粤公网安备 44051102000370号 | 粤ICP备11014136号

© 2010-2017 FishC.com GMT+8, 2017-9-25 12:21 Powered by Discuz! X2.5 Theme by dreambred

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