4.1.3 自增和自减
VC++6. 0使用“++”、“--”来实现自增和自减操作。自增和自减有两种定义,一种为自增自减运算符在语句块之后,则先执行语句块,再执行自增自减;另一种恰恰相反,自增自减运算符在语句块之前,则先执行自增和自减,再执行语句块。通常,自增和自减是被拆分成两条汇编指令语句执行的,如代码清单4-11所示。
代码清单4-11 自增和自减
//C++源码说明:除法运算
//变量定义并初始化
int nVarOne=argc;
int nVarTwo=argc;
//变量后缀自增参与表达式运算
nVarTwo=5+(nVarOne++);
//变量前缀自增参与表达式运算
nVarTwo=5+(++nVarOne);
//变量后缀自减参与表达式运算
nVarOne=5+(nVarTwo--);
//变量前缀自减参与表达式运算
nVarOne=5+(--nVarTwo);
//C++源码与对应汇编代码讲解
//变量定义初始化略
//C++源码对比,后缀自增运算
nVarTwo=5+(nVarOne++);
;取出变量nVarOne,保存在edx中
0040BA34 mov edx, dword ptr[ebp-4]
;对edx执行加等于5
0040BA37 add edx,5
;将edx赋值给变量nVarTwo,可以看到没有对变量nVarOne执行自增运算
0040BA3A mov dword ptr[ebp-8],edx
;再次取出变量nVarOne数据存入eax中
0040BA3D mov eax, dword ptr[ebp-4]
;执行eax加等于1
0040BA40 add eax,1
;将eax赋值给变量nVarOne,等同于对变量nVarOne执行自增1操作
0040BA43 mov dword ptr[ebp-4],eax
//C++源码对比,前缀自增运算
nVarTwo=5+(++nVarOne);
;取出变量nVarOne数据放入ecx中
0040BA46 mov ecx, dword ptr[ebp-4]
;对ecx执行加等于1操作
0040BA49 add ecx,1
;将ecx赋值给变量nVarOne,完成自增1操作
0040BA4C mov dword ptr[ebp-4],ecx
;取出变量nVarOne放入edx中
0040BA4F mov edx, dword ptr[ebp-4]
;对edx执行加等于5
0040BA52 add edx,5
;将结果edx赋值给变量nVarTwo
0040BA55 mov dword ptr[ebp-8],edx
;自减与自增相似,只是将add改为sub,略
从代码清单4-11中可以看出,VC++6.0先将自增自减运算进行分离,然后根据运算符的位置来决定执行顺序。将原语句块“VarTwo=5+(nVarOne++);”分解为“VarTwo=5+nVarOne;”和“nVarOne+=1;”,这样就实现了先参与语句块运算,再自增1。同理,前缀++的拆分过程只是执行顺序做了替换,先将自身加等于1,再参与表达式运算。在识别过程中,后缀++必然会保存计算前的变量值,在表达式计算完成后,才取出之前的值加1,这是个显著特点。