鱼C论坛

 找回密码
 立即注册
查看: 1888|回复: 12

[已解决]累加问题

[复制链接]
发表于 2018-6-2 09:37:09 | 显示全部楼层 |阅读模式

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

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

x
#include "stdio.h"
void  main()
{
        int i ,j ,p ,q ;
        i=5,j=5;
        p=(i++)+(i++)+(i++);
        q=(++j)+(++j)+(++j);
        printf("i=%d j=%d p=%d q=%d\n",i,j,p,q);
}
        i=8,j=8,p=15,q=22;

求解释
最佳答案
2018-6-2 10:23:56
首先同意二楼的说法

这里简单解释一下结果
ij为8因为都自增了3次,容易理解
p为15因为后置加加是先使用再自增,所以为三个5的和
关键是q,求解过程这样的,注意看括号
((++j)+(++j))+(++j)
先完成两次自增变为7相加得到14
然后变成
14+(++j)
j自增变成8,最终即为22
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-2 09:40:56 | 显示全部楼层
原来很迷茫 现在在学习汇编,然后知道编译器的问题
其实你不用懂  你只要知道i++ --i 语法意思就可以 后面学习玩C,从汇编层面来看就会迎刃而解,现在讲也都是字面意思还是会忘
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-6-2 10:16:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-6-2 10:17:59 | 显示全部楼层

还是想知道字面意思  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-2 10:23:56 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
首先同意二楼的说法

这里简单解释一下结果
ij为8因为都自增了3次,容易理解
p为15因为后置加加是先使用再自增,所以为三个5的和
关键是q,求解过程这样的,注意看括号
((++j)+(++j))+(++j)
先完成两次自增变为7相加得到14
然后变成
14+(++j)
j自增变成8,最终即为22
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-2 10:39:21 | 显示全部楼层
BngThea 发表于 2018-6-2 10:23
首先同意二楼的说法

这里简单解释一下结果

使用加法是不是必须要确定加号两边的值才可以相加
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-2 12:05:27 From FishC Mobile | 显示全部楼层
不主动 发表于 2018-6-2 10:39
使用加法是不是必须要确定加号两边的值才可以相加

那是当然
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-2 14:08:30 | 显示全部楼层
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-2 14:09:50 | 显示全部楼层
不要说代码和你的不一样
完全复制你的代码

2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-2 14:24:11 | 显示全部楼层
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int i, j, p, q;
  5.         i = 5, j = 5;

  6.         p = (i++) + (i++) + (i++);
  7.         q = (++j) + (++j) + (++j);
  8.        
  9.         printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);

  10.         return 0;
  11. }
复制代码

  1. int main(void)
  2. {
  3. 010A7700  push        ebp  
  4. 010A7701  mov         ebp,esp  
  5. 010A7703  sub         esp,0F0h  
  6. 010A7709  push        ebx  
  7. 010A770A  push        esi  
  8. 010A770B  push        edi  
  9. 010A770C  lea         edi,[ebp-0F0h]  
  10. 010A7712  mov         ecx,3Ch  
  11. 010A7717  mov         eax,0CCCCCCCCh  
  12. 010A771C  rep stos    dword ptr es:[edi]  
  13.         int i, j, p, q;
  14.         i = 5, j = 5;
  15. 010A771E  mov         dword ptr [i],5  
  16. 010A7725  mov         dword ptr [j],5  

  17.         p = (i++) + (i++) + (i++);
  18. 010A772C  mov         eax,dword ptr [i]  
  19. 010A772F  add         eax,dword ptr [i]  
  20. 010A7732  add         eax,dword ptr [i]  
  21. 010A7735  mov         dword ptr [p],eax  
  22. 010A7738  mov         ecx,dword ptr [i]  
  23. 010A773B  add         ecx,1  
  24. 010A773E  mov         dword ptr [i],ecx  
  25. 010A7741  mov         edx,dword ptr [i]  
  26. 010A7744  add         edx,1  
  27. 010A7747  mov         dword ptr [i],edx  
  28. 010A774A  mov         eax,dword ptr [i]  
  29. 010A774D  add         eax,1  
  30. 010A7750  mov         dword ptr [i],eax  
  31.         q = (++j) + (++j) + (++j);
  32. 010A7753  mov         eax,dword ptr [j]  
  33. 010A7756  add         eax,1  
  34. 010A7759  mov         dword ptr [j],eax  
  35. 010A775C  mov         ecx,dword ptr [j]  
  36. 010A775F  add         ecx,1  
  37. 010A7762  mov         dword ptr [j],ecx  
  38. 010A7765  mov         edx,dword ptr [j]  
  39. 010A7768  add         edx,1  
  40. 010A776B  mov         dword ptr [j],edx  
  41. 010A776E  mov         eax,dword ptr [j]  
  42. 010A7771  add         eax,dword ptr [j]  
  43. 010A7774  add         eax,dword ptr [j]  
  44. 010A7777  mov         dword ptr [q],eax  
  45.        
  46.         printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);
  47. 010A777A  mov         eax,dword ptr [q]  
  48. 010A777D  push        eax  
  49. 010A777E  mov         ecx,dword ptr [p]  
  50. 010A7781  push        ecx  
  51. 010A7782  mov         edx,dword ptr [j]  
  52. 010A7785  push        edx  
  53. 010A7786  mov         eax,dword ptr [i]  
  54. 010A7789  push        eax  
  55. 010A778A  push        offset string "i=%d j=%d p=%d q=%d\n" (01133E50h)  
  56. 010A778F  call        _printf (0109BD9Bh)  
  57. 010A7794  add         esp,14h  

  58.         return 0;
  59. 010A7797  xor         eax,eax  
  60. }
  61. 010A7799  pop         edi  
  62. 010A779A  pop         esi  
  63. 010A779B  pop         ebx  
  64. 010A779C  add         esp,0F0h  
  65. 010A77A2  cmp         ebp,esp  
  66. 010A77A4  call        __RTC_CheckEsp (0109A383h)  
  67. 010A77A9  mov         esp,ebp  
  68. 010A77AB  pop         ebp  
  69. 010A77AC  ret  
复制代码





  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int i, j, p, q;
  5.         i = 5, j = 5;


  6.         // *******************************
  7.         p = i + i + i;
  8.         i++;
  9.         i++;
  10.         i++;

  11.         p = (i++) + (i++) + (i++);
  12.         // *******************************
  13.         ++j;
  14.         ++j;
  15.         ++j;
  16.         q = j + j + j;

  17.         q = (++j) + (++j) + (++j);
  18.         // *******************************

  19.         printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);

  20.         return 0;
  21. }
复制代码

  1. int main(void)
  2. {
  3. 00C37700  push        ebp  
  4. 00C37701  mov         ebp,esp  
  5. 00C37703  sub         esp,0F0h  
  6. 00C37709  push        ebx  
  7. 00C3770A  push        esi  
  8. 00C3770B  push        edi  
  9. 00C3770C  lea         edi,[ebp-0F0h]  
  10. 00C37712  mov         ecx,3Ch  
  11. 00C37717  mov         eax,0CCCCCCCCh  
  12. 00C3771C  rep stos    dword ptr es:[edi]  
  13.         int i, j, p, q;
  14.         i = 5, j = 5;
  15. 00C3771E  mov         dword ptr [i],5  
  16. 00C37725  mov         dword ptr [j],5  


  17.         // *******************************
  18.         p = i + i + i;
  19. 00C3772C  mov         eax,dword ptr [i]  
  20. 00C3772F  add         eax,dword ptr [i]  
  21. 00C37732  add         eax,dword ptr [i]  
  22. 00C37735  mov         dword ptr [p],eax  
  23.         i++;
  24. 00C37738  mov         eax,dword ptr [i]  
  25. 00C3773B  add         eax,1  
  26. 00C3773E  mov         dword ptr [i],eax  
  27.         i++;
  28. 00C37741  mov         eax,dword ptr [i]  
  29. 00C37744  add         eax,1  
  30. 00C37747  mov         dword ptr [i],eax  
  31.         i++;
  32. 00C3774A  mov         eax,dword ptr [i]  
  33. 00C3774D  add         eax,1  
  34. 00C37750  mov         dword ptr [i],eax  

  35.         p = (i++) + (i++) + (i++);
  36. 00C37753  mov         eax,dword ptr [i]  
  37. 00C37756  add         eax,dword ptr [i]  
  38. 00C37759  add         eax,dword ptr [i]  
  39. 00C3775C  mov         dword ptr [p],eax  
  40. 00C3775F  mov         ecx,dword ptr [i]  
  41. 00C37762  add         ecx,1  
  42. 00C37765  mov         dword ptr [i],ecx  
  43. 00C37768  mov         edx,dword ptr [i]  
  44. 00C3776B  add         edx,1  
  45. 00C3776E  mov         dword ptr [i],edx  
  46. 00C37771  mov         eax,dword ptr [i]  
  47. 00C37774  add         eax,1  
  48. 00C37777  mov         dword ptr [i],eax  
  49.         // *******************************
  50.         ++j;
  51. 00C3777A  mov         eax,dword ptr [j]  
  52. 00C3777D  add         eax,1  
  53. 00C37780  mov         dword ptr [j],eax  
  54.         ++j;
  55. 00C37783  mov         eax,dword ptr [j]  
  56. 00C37786  add         eax,1  
  57. 00C37789  mov         dword ptr [j],eax  
  58.         ++j;
  59. 00C3778C  mov         eax,dword ptr [j]  
  60.         ++j;
  61. 00C3778F  add         eax,1  
  62. 00C37792  mov         dword ptr [j],eax  
  63.         q = j + j + j;
  64. 00C37795  mov         eax,dword ptr [j]  
  65. 00C37798  add         eax,dword ptr [j]  
  66. 00C3779B  add         eax,dword ptr [j]  
  67. 00C3779E  mov         dword ptr [q],eax  

  68.         q = (++j) + (++j) + (++j);
  69. 00C377A1  mov         eax,dword ptr [j]  
  70. 00C377A4  add         eax,1  
  71. 00C377A7  mov         dword ptr [j],eax  
  72. 00C377AA  mov         ecx,dword ptr [j]  
  73. 00C377AD  add         ecx,1  
  74. 00C377B0  mov         dword ptr [j],ecx  
  75. 00C377B3  mov         edx,dword ptr [j]  
  76. 00C377B6  add         edx,1  
  77. 00C377B9  mov         dword ptr [j],edx  
  78. 00C377BC  mov         eax,dword ptr [j]  
  79. 00C377BF  add         eax,dword ptr [j]  
  80. 00C377C2  add         eax,dword ptr [j]  
  81. 00C377C5  mov         dword ptr [q],eax  
  82.         // *******************************

  83.         printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);
  84. 00C377C8  mov         eax,dword ptr [q]  
  85. 00C377CB  push        eax  
  86. 00C377CC  mov         ecx,dword ptr [p]  
  87. 00C377CF  push        ecx  
  88. 00C377D0  mov         edx,dword ptr [j]  
  89. 00C377D3  push        edx  
  90. 00C377D4  mov         eax,dword ptr [i]  
  91. 00C377D7  push        eax  
  92. 00C377D8  push        offset string "i=%d j=%d p=%d q=%d\n" (0CC3E50h)  
  93. 00C377DD  call        _printf (0C2BD9Bh)  
  94.         // *******************************

  95.         printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);
  96. 00C377E2  add         esp,14h  

  97.         return 0;
  98. 00C377E5  xor         eax,eax  
  99. }
  100. 00C377E7  pop         edi  
  101. 00C377E8  pop         esi  
  102. 00C377E9  pop         ebx  
  103. 00C377EA  add         esp,0F0h  
  104. 00C377F0  cmp         ebp,esp  
  105. 00C377F2  call        __RTC_CheckEsp (0C2A383h)  
  106. 00C377F7  mov         esp,ebp  
  107. 00C377F9  pop         ebp  
  108. 00C377FA  ret  
复制代码



可以看到
  1.         p = i + i + i;
  2.         i++;
  3.         i++;
  4.         i++;
复制代码

相当于
  1. p = (i++) + (i++) + (i++);
复制代码



  1.         ++j;
  2.         ++j;
  3.         ++j;
  4.         q = j + j + j;
复制代码

相当于
  1. q = (++j) + (++j) + (++j);
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-2 14:38:32 | 显示全部楼层
人造人 发表于 2018-6-2 14:09
不要说代码和你的不一样
完全复制你的代码

  不知道了   我的运行出来是22
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-2 14:40:00 | 显示全部楼层
人造人 发表于 2018-6-2 14:24
可以看到

相当于

辛苦了  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-2 14:41:41 | 显示全部楼层
不主动 发表于 2018-6-2 14:38
不知道了   我的运行出来是22

嗯,这类语法在标准中的定义是"未定义"的,也就是说不同的编译器可能会有不同的结果
说白了就是编译器爱咋搞就咋搞
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 07:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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