|
![]() | 作者: sniper167 [sniper167]
![]() |
登录 |
这里主要研究一下c语言和c++中的a++,++a 在语言中定义a++是先用后加,++a是先加后用。 实际上他说的是在一个语句中 即如k=(++a)+(a++); a++是语句结束后在后加,,++a是先加后计算再语句结束。 我举几个例子(用反汇编说明) 1 int k=2; int val=0; val=(k++)+(k++); 反汇编 8: int k=2; 00401028 mov dword ptr [ebp-4],2//// k的地址是dword ptr [ebp-4] 9: int val=0; 0040102F mov dword ptr [ebp-8],0//val的地址是dword ptr [ebp-8] 10: val=(k++)+(k++); 00401036 mov eax,dword ptr [ebp-4]// 把2放入eax中 00401039 add eax,dword ptr [ebp-4]// 把2+2=4放入eax中 0040103C mov dword ptr [ebp-8],eax//把eax中的4移回val中 0040103F mov ecx,dword ptr [ebp-4] 00401042 add ecx,1// 00401045 mov dword ptr [ebp-4],ecx//k地址中的值加1,k=3 00401048 mov edx,dword ptr [ebp-4] 0040104B add edx,1// 寄存器中的值加1,k=4 0040104E mov dword ptr [ebp-4],edx//移回k地址 结论:val=*( dword ptr [ebp-8])=4;k=4 2. int k=2; int val=0; k=(k++)+(k++); 反汇编 : 8: int k=2; 00401028 mov dword ptr [ebp-4],2//同上 9: int val=0; 0040102F mov dword ptr [ebp-8],0 10: k=(k++)+(k++); 00401036 mov eax,dword ptr [ebp-4] 00401039 add eax,dword ptr [ebp-4] //同上 0040103C mov dword ptr [ebp-4],eax//同上,不同的是计算结果存入k地址k=4 0040103F mov ecx,dword ptr [ebp-4] 00401042 add ecx,1//寄存器中的值加1, 00401045 mov dword ptr [ebp-4],ecx//k=5 00401048 mov edx,dword ptr [ebp-4] 0040104B add edx,1//寄存器中的值加1 0040104E mov dword ptr [ebp-4],edx//k=6 结论:k=*( dword ptr [ebp-4])=6; 3 int k=2; int val=0; val=(++k)+(++k); 反汇编: 8: int k=2; 00401028 mov dword ptr [ebp-4],2// k的地址是dword ptr [ebp-4] 9: int val=0; 0040102F mov dword ptr [ebp-8],0//val的地址是dword ptr [ebp-8] 10: val=(++k)+(++k);//k先加 00401036 mov eax,dword ptr [ebp-4] 00401039 add eax,1//寄存器中的值加1 0040103C mov dword ptr [ebp-4],eax//k=3 0040103F mov ecx,dword ptr [ebp-4] 00401042 add ecx,1//对k地址中的值加1,k=4 00401045 mov dword ptr [ebp-4],ecx 00401048 mov edx,dword ptr [ebp-4] 0040104B add edx,dword ptr [ebp-4]//k+k=8 0040104E mov dword ptr [ebp-8],edx//值移入val地址中val=8 结论:val=*( dword ptr [ebp-8])=8;k=4 4. int k=2; int val=0; k=(++k)+(++k); 反汇编: 8: int k=2; 00401028 mov dword ptr [ebp-4],2 9: int val=0; 0040102F mov dword ptr [ebp-8],0 10: k=(++k)+(++k); 00401036 mov eax,dword ptr [ebp-4] 00401039 add eax,1 0040103C mov dword ptr [ebp-4],eax 0040103F mov ecx,dword ptr [ebp-4] 00401042 add ecx,1 00401045 mov dword ptr [ebp-4],ecx 00401048 mov edx,dword ptr [ebp-4] 0040104B add edx,dword ptr [ebp-4]///以上同3例 0040104E mov dword ptr [ebp-4],edx// 值移入k地址k=8 结论:k=*( dword ptr [ebp-4])=8; 5. int k=2; int val=0; val=(++k)+(k++); 反汇编: 8: int k=2; 00401028 mov dword ptr [ebp-4],2 9: int val=0; 0040102F mov dword ptr [ebp-8],0 10: val=(++k)+(k++); 00401036 mov eax,dword ptr [ebp-4] 00401039 add eax,1 0040103C mov dword ptr [ebp-4],eax//k=k+1=3 0040103F mov ecx,dword ptr [ebp-4] 00401042 add ecx,dword ptr [ebp-4]//k+k=6 00401045 mov dword ptr [ebp-8],ecx//val=6 00401048 mov edx,dword ptr [ebp-4] 0040104B add edx,1//k=k+1=4 0040104E mov dword ptr [ebp-4],edx 结论:val=*( dword ptr [ebp-8])=6;k=4 6. int k=2; int val=0; k=(++k)+(k++); 反汇编: 8: int k=2; 00401028 mov dword ptr [ebp-4],2 9: int val=0; 0040102F mov dword ptr [ebp-8],0 10: k=(++k)+(k++); 00401036 mov eax,dword ptr [ebp-4] 00401039 add eax,1//k+1 0040103C mov dword ptr [ebp-4],eax//k=3 0040103F mov ecx,dword ptr [ebp-4] 00401042 add ecx,dword ptr [ebp-4]//k+k=6 00401045 mov dword ptr [ebp-4],ecx//k=6 00401048 mov edx,dword ptr [ebp-4] 0040104B add edx,1 0040104E mov dword ptr [ebp-4],edx//k=k+1=7 结论:k=*( dword ptr [ebp-4])=7;k=7 "a--,--a"与++a,a++相同 |
地主 发表时间: 04-01-02 22:21 |
![]() | 回复: TomyChen [quest] ![]() |
登录 |
顶一下~ 前段时间被一人问得答不上来 ![]() |
B1层 发表时间: 04-01-03 08:51 |
![]() | 回复: afan271314 [afan271314] ![]() |
登录 |
楼主是转的帖子 还是原创啊 如果是转的 请问 在哪转的啊 |
B2层 发表时间: 04-01-03 09:48 |
![]() | 回复: sniper167 [sniper167] ![]() |
登录 |
你看看标题不就知道了. |
B3层 发表时间: 04-01-03 19:11 |
![]() | 回复: afan271314 [afan271314] ![]() |
登录 |
我要网址 |
B4层 发表时间: 04-01-03 21:13 |
![]() | 回复: sniper167 [sniper167] ![]() |
登录 |
http://www.programfan.net |
B5层 发表时间: 04-01-05 12:59 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号