论坛: 编程破解 标题: 让c语言和c++中的“a++,++a”永远不是问题[转自编程爱好者] 复制本贴地址    
作者: 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号