赞
踩
【转】
#include <stdio.h>
int main()
{
int a , b;
a = 3;
b = (a++)+(a++)+(a++);
printf("a=%d b=%d/n", a ,b );
a = 3;
b = (++a)+(++a)+(++a);
printf("a=%d b=%d/n", a ,b );
return 0;
}
VC反汇编代码:
#include <stdio.h>
2: int main()
3: {
0040D730 55 push ebp
0040D731 8B EC mov ebp,esp
0040D733 83 EC 48 sub esp,48h
0040D736 53 push ebx
0040D737 56 push esi
0040D738 57 push edi
0040D739 8D 7D B8 lea edi,[ebp-48h]
0040D73C B9 12 00 00 00 mov ecx,12h
0040D741 B8 CC CC CC CC mov eax,0CCCCCCCCh
0040D746 F3 AB rep stos dword ptr [edi]
4: int a , b;
5: a = 3;
0040D748 C7 45 FC 03 00 00 00 mov dword ptr [ebp-4],3
6: b = (a++)+(a++)+(a++);
0040D74F 8B 45 FC mov eax,dword ptr [ebp-4]
0040D752 03 45 FC add eax,dword ptr [ebp-4]
0040D755 03 45 FC add eax,dword ptr [ebp-4];这里先进行括号外的加运算
0040D758 89 45 F8 mov dword ptr [ebp-8],eax
0040D75B 8B 4D FC mov ecx,dword ptr [ebp-4];然后执行括号内的运算
0040D75E 83 C1 01 add ecx,1
0040D761 89 4D FC mov dword ptr [ebp-4],ecx
0040D764 8B 55 FC mov edx,dword ptr [ebp-4]
0040D767 83 C2 01 add edx,1
0040D76A 89 55 FC mov dword ptr [ebp-4],edx
0040D76D 8B 45 FC mov eax,dword ptr [ebp-4]
0040D770 83 C0 01 add eax,1
0040D773 89 45 FC mov dword ptr [ebp-4],eax
7: printf("a=%d b=%d/n", a ,b );
0040D776 8B 4D F8 mov ecx,dword ptr [ebp-8]
0040D779 51 push ecx
0040D77A 8B 55 FC mov edx,dword ptr [ebp-4]
0040D77D 52 push edx
0040D77E 68 1C 20 42 00 push offset string "a=%d/nb=%d/n" (0042201c)
0040D783 E8 18 39 FF FF call printf (004010a0)
0040D788 83 C4 0C add esp,0Ch
8:
9: a = 3;
0040D78B C7 45 FC 03 00 00 00 mov dword ptr [ebp-4],3
10: b = (++a)+(++a)+(++a);
0040D792 8B 45 FC mov eax,dword ptr [ebp-4]
0040D795 83 C0 01 add eax,1
0040D798 89 45 FC mov dword ptr [ebp-4],eax;执行第一个括号内的加运算
0040D79B 8B 4D FC mov ecx,dword ptr [ebp-4]
0040D79E 83 C1 01 add ecx,1
0040D7A1 89 4D FC mov dword ptr [ebp-4],ecx;执行第二个括号内的加运算
0040D7A4 8B 55 FC mov edx,dword ptr [ebp-4]
0040D7A7 03 55 FC add edx,dword ptr [ebp-4];将前两个括号内的值相加
0040D7AA 8B 45 FC mov eax,dword ptr [ebp-4]
0040D7AD 83 C0 01 add eax,1
0040D7B0 89 45 FC mov dword ptr [ebp-4],eax;执行第三个括号的加运算
0040D7B3 03 55 FC add edx,dword ptr [ebp-4];将三个括号内的值相加
0040D7B6 89 55 F8 mov dword ptr [ebp-8],edx;保存结果
11: printf("a=%d b=%d/n", a ,b );
0040D7B9 8B 4D F8 mov ecx,dword ptr [ebp-8]
0040D7BC 51 push ecx
0040D7BD 8B 55 FC mov edx,dword ptr [ebp-4]
0040D7C0 52 push edx
0040D7C1 68 1C 20 42 00 push offset string "a=%d/nb=%d/n" (0042201c)
0040D7C6 E8 D5 38 FF FF call printf (004010a0)
0040D7CB 83 C4 0C add esp,0Ch
12:
13:
14:
15: return 0;
0040D7CE 33 C0 xor eax,eax
16: }
0040D7D0 5F pop edi
0040D7D1 5E pop esi
0040D7D2 5B pop ebx
0040D7D3 83 C4 48 add esp,48h
0040D7D6 3B EC cmp ebp,esp
0040D7D8 E8 43 39 FF FF call __chkesp (00401120)
0040D7DD 8B E5 mov esp,ebp
0040D7DF 5D pop ebp
0040D7E0 C3 ret
总结:
对于b = (a++)+(a++)+(a++);
在遇到分号之前是不执行加一操作的,而只是简单的把三个括号的值相加,这样b=3+3+3=9;当遇到分号的时候,就要进行后自增运算了,这时会进行3次自增运算,最后a=6。
对于b = (++a)+(++a)+(++a);
每次遇到一个前自增运算符,都要进行加一操作,首先是第一个括号内进行加一操作得到a=4,然后第二个括号内进行加一操作得到a=5,这样子前面两个括号的值为10=5+5;然后计算第三个括号的值使得a=6,然后加上前面得到的16,最后得到b=16。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。