本帖最后由 coding_wang 于 2015-9-8 22:53 编辑
第一篇地址:
[url=http://bbs.itheima.com/thread-236166-1-1.html]b=++a + a++的各种变种问题的计算过程大揭密!![/url]
之前说到了两个自增变量的相加问题
咱们在来研究一下三个自增变量相加的计算过程
以下是int a=3,b=0;b = a++ + ++a + ++a; 的汇编过程:
- //b = a++ + ++a + ++a;
- //int a=3,b=0;
- mov dword ptr [ebp-4] 3
- mov dword ptr [ebp-8] 0
- //b = a++ + ++a + ++a;
- mov eax dword ptr [ebp-4] //eax=a
- add eax 1 //eax = eax + 1
- mov dword ptr [ebp-4] eax //a=eax a==4
- mov ecx dword ptr [ebp-4] //ecx= a;
- add ecx dword ptr [ebp-4] //ecx= exc + a = 4 + 4=8, a==4
- mov edx dword ptr [ebp-4] //edx = a
- add edx 1 //edx = edx + 1
- mov dword ptr [ebp-4] edx //a = edx a=5
- add ecx dword ptr [ebp-4] //ecx = ecx + a = 8 + 5 = 13
- mov dword ptr [ebp-8] ecx //b=ecx
- mov eax dword ptr [ebp-4] //eax = a
- add eax 1 // eax = eax + 1
- mov dword ptr [ebp-4] //eax a = eax
复制代码 根据汇编过程,我们可以知道它计算过程是这样的:
1)a = a + 1 = 4;
2) int c =a * 2 = 8;
3) a= a + 1 = 5;
4) b= c + a = 8 + 5 = 13
所以,整个表达式先执行了左边两个自增变量的计算,再将计算结果与第三个自增变量进行计算。
唉~~~本来试了好多例子……慢慢说可以说一年的……可是……我的泡面都泡成粥了……
直接上干货吧
1.两个自增变量进行运算时,按(++a)变量类型的个数先处理自增变量,将处理后的值同等替代 a++和++a ,最后根据运算符进行运算,而表达式中的(a++)类型变量的加1处理,都等到语句运算结束后才进行处理。
例如:
b= a++ + ++a等同与 {b=(a+1 + a+1);a += 1; }
b=a++ + a++等同与{b=a+a; a += 2;}
b=++a + ++a等同与 { a=a+2 ;b=a + a; }
处理过程只跟(++a)型变量个数有关,与顺序无关,
例如:
b=a++ + ++a;的值 等于 b=++a + a++; 的值
2.当多个自增变量进行运算时,将根据运算符的优先级两两结合运算
例如 b = a++ + a++ + ++a; 等同与 b = ((a++ + a++) + ++a)=((a+a)+ ++a )=((a+a)+a+1); a=((a+1)+2);
虽然凉了的泡面粥的不好吃,但是解决了问题的心情还是很好的,幸好我没有听妹子的话放弃测试跟她出去玩~~~~
…………………………呃………………………………我是不是错过了什么……
|
|