A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 coding_wang 于 2015-9-8 22:49 编辑

最近老是看到有各位朋友发一些关于a++ b++ ++a  ++b的各种各种问题
有些题目还能吃的消,然而有些题,光看题目就已经醉了~~~
由于身边有几个妹子也学编程,想着万一有妹子问我,我又答不上来岂不是很尴尬~~~
所以就花了 “一杯泡面” 的时间彻底地搞清楚了一个语句多个自增自减的计算方法
---------------------翱~翔~的~分~界~线------------------------------------
首先 上题目~!!!!!大家可以自行计算一下,看看你的算法跟答案会不会一样~!







每当我自信满满地验证答案时,我都听到了一声声清脆的打脸声……
WTF……就算妹子告诉我她绝对不问我这个问题,我也不能不把它搞清楚!!!!
可是,要怎么做呢?????一个语句里面又不能断句,把这个语句拆开又没有研究的意义了~~肿么办呢???


  吃了一口泡面的我突然灵光一闪  
vc的调试模式-->debug里头 有个step into的选项,可以进入某一个语句当中,查看这个语句的汇编过程……
虽然我没学过汇编……但是看看又不会怀孕……

于是 我试了试int a=3,b=0; b = ++a + ++a 的汇编过程 //主要是觉得这个应该很简单……结果它b的值居然是10……实在是太打脸了……
汇编过程是这样的:

  1. //int a=3,b=0;
  2. mov   dword ptr [ebp-4]   3       //将a存储在 寄存器 ebp-4 中 其值为 3
  3. mov   dword ptr [ebp-8]   0     //将b存储在 寄存器 ebp-8 中 其值为 0
  4. //b= ++a + ++a
  5. mov   eax   dword ptr [ebp-4]     //将 ebp-4(即a) 传递给 eax
  6. add   eax   1      //为eax + 1
  7. mov   dword ptr [ebp-4]   eax      //将 eax的值传递给 ebp-4  此时 a=4
  8. mov   ecx   dword ptr [ebp-4]      //再来一遍
  9. add   ecx   1
  10. mov   dword ptr [ebp-4]   ecx      //此时 a=5
  11. mov   edx   dword ptr [ebp-4]       //将 ebp-4 传递给edx
  12. add   edx   dword ptr [ebp-4]     //将edx加上 ebp-4 的值   即 exd=10
  13. mov   dword ptr [ebp-8]   edx     //将edx的值传递给 ebp-8 即 b   所以 b=10;
复制代码
不要问我为什么突然就能看懂汇编了,因为----这些都是我猜的-----(难道我会告诉你:总共只有两个操作……百度一下就都出来了……)

我们看到汇编过程就会发现,它的执行过程是   
1)a=a+1=4;
2) a=a+1=5;
3)b=2*a=10;
跟书上完全不一样有木有!!!!!!!为什么是这样~?????


接着我又试了一下 int a=3,b=0; b = a++ + ++a;
  1. //b = a++ + ++a;
  2. //int a=3,b=0;
  3. mov   dword ptr [ebp-4]   3     //将a存储在 寄存器 ebp-4 中 其值为 3
  4. mov   dword ptr [ebp-8]   0    //将b存储在 寄存器 ebp-8 中 其值为 0
  5. //b = a++ + ++a;
  6. mov           eax   dword ptr [ebp-4]    //将 ebp-4(即a) 传递给 eax
  7. add           eax   1    //为eax + 1
  8. mov           dword ptr [ebp-4]    eax    //将 eax的值传递给 ebp-4  此时 a=4
  9. mov            ecx    dword ptr [ebp-4]   //将ebp-4 的值传递给 ecx               
  10. add            ecx   dword ptr [ebp-4]   //将ecx 加上 ebp-4的值 即 ecx=8
  11. mov            dword ptr [ebp-8]    ecx    //将ecx的值传给 ebp-8 即 b=8;
  12. mov            edx   dword ptr [ebp-4]   //为a再加1
  13. add            edx   1
  14. mov            dword ptr [ebp-4]   edx
复制代码
这次,它的运算过程是这样的:
1) a=a+1=4
2) b=2*a=8;
3) a=a+1=5;
看到木有,首先计算了a+1的值,并且将a+1的值作为 a++和++a的值计算b的值,最后还为a加了1。
因此,我们猜想,一个运算表达式中按照结合性计算时遇到a++和++a,优先为a+1,再以a+1作为a++和++a的值进行运算
验证一下:
      

没错~!就是这样~!!!!


呃  一个帖子原来是有字数限制的~~~~另开个帖子继续揭秘三个自增变量相加的汇编过程的~~~~~~




第二篇    地址:b=++a  + a++的各种变种问题的计算过程大揭密(二)







3 个回复

倒序浏览
人工置顶~~
回复 使用道具 举报
学到了好多啊
回复 使用道具 举报
人工置顶
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马