前缀和后缀操作符的语义区别

ZDNet软件频道 时间:2003-10-21 作者:ZDNet China |  我要评论()
本文关键词:cpptips
深入理解前缀和后缀操作符的语义区别是正确地处理各种算法表达式,调试程序,以及性能分析的关键。
本文译自Builder.com,未经许可请勿转载内建式++和--操作符可以出现在一个操作数的任何一边:

int n=0;
++n; // 前缀++
n++; // 后缀 ++

深入理解前缀和后缀操作符的语义区别是正确地处理各种算法表达式,调试程序,以及性能分析的关键。

虽然这些操作符的执行在很大程序上依赖于硬件体系和使用的编译器,但我还是想通过一些具体的范例来说明两个不同类型的操作符之间的通用的语义区别。如果你想检查程序执行过程,可以编译以下提供的代码片段,并查看编译器如何执行前缀和后缀的操作符。

一个前缀的操作符首先改变它的操作数,然后使用运行之后的值,例如:

int n=0;
int m=0;
n= ++m; // 累加m, 然后赋值给n
std::cout <<n <<", "<<m<<std::endl; // 显示1, 1

在这种情况,经过赋值之后,n的值为1,因为m在被赋予n之前就递增。现在让我们看一看后缀的情况。

int n=0;
int m=0;
n=m++; // 首先将m的值赋给n, 然后m递增

std::cout <<n <<", "<<m<<std::endl; //显示0, 1

这一情况,经过赋值之后n为0.这是因为,在++操作符递增之前m的原始值被赋予n.

检查这两个代码列表生成的汇编代码有助于你更深入地理解这些操作符的执行。

// disassembled code of m=n++;
mov ecx, [ebp-0x04] // store n's value in ecx register
mov [ebp-0x08], ecx // assign ecx's value to m
inc dword ptr [ebp-0x04] // increment n

// disassembled code of m=++n;
inc dword ptr [ebp-0x04] // increment n
mov eax, [ebp-0x04] // store n's value in eax register
mov [ebp-0x08], eax // assign eax's value to m


本文作者Danny Kalev 是一个系统分析家、软件工程师,在C++和面向对象设计方面有着14年的专业经验。




责任编辑:炒饭

欢迎评论投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134