免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1090 | 回复: 0
打印 上一主题 下一主题

前缀和后缀操作符的语义区别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-10-31 15:15 |只看该作者 |倒序浏览
内建式++和--操作符可以出现在一个操作数的任何一边:

  
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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP