鱼C论坛

 找回密码
 立即注册
查看: 3500|回复: 11

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

[复制链接]
发表于 2017-7-10 08:09:54 | 显示全部楼层 |阅读模式

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

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

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呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-10 10:37:18 | 显示全部楼层
本帖最后由 ba21 于 2017-7-10 14:41 编辑


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

2017-07-10_103558.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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  
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-10 13:10:16 | 显示全部楼层

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

使用道具 举报

发表于 2017-7-10 13:31:11 | 显示全部楼层

你得到的是24 ; 我这是22 不应该呀。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-10 14:09:35 | 显示全部楼层
ba21 发表于 2017-7-10 13:31
你得到的是24 ; 我这是22 不应该呀。

正常
无标题.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-7-10 14:25:52 | 显示全部楼层
不建议用这种“折磨人”的写法,语义不明,除了考试毫无用处
更重要的是,不同编译器的翻译也有区别,导致其计算结果存在区别。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢啦~貌似这是编译器的求值顺序问题。。它只能保证j最终是8来的。还有汇编语句看不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

恩恩,貌似编译器不一样算的结果也不一样。那这种题考试遇到了怎么办呢。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-16 22:23:09 | 显示全部楼层
沧海雨季 发表于 2017-7-16 22:21
恩恩,貌似编译器不一样算的结果也不一样。那这种题考试遇到了怎么办呢。。。

按教课老师说的来咯。不过差不多也就2种情况。
你可以在各种编译器上都试下什么结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-7 05:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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