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,这是个显著特点。