C语言自增自减运算符深入剖析.docx

C语言自增自减运算符深入剖析.docx

ID:51687842

大小:35.08 KB

页数:4页

时间:2020-03-15

C语言自增自减运算符深入剖析.docx_第1页
C语言自增自减运算符深入剖析.docx_第2页
C语言自增自减运算符深入剖析.docx_第3页
C语言自增自减运算符深入剖析.docx_第4页
资源描述:

《C语言自增自减运算符深入剖析.docx》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、C语言自增自减运算符深入剖析发布日期:2009-03-23  来源:Doforfun.net  作者:Eric.H.Sento引子C语言的自增++,自减--运算符对于初学者来说一直都是个难题,甚至很多老手也会产生困惑,最近我在网上看到一个问题:#includevoidmain() /*主函数*/{ inta,b,c,d; a=5; b=5; c=(a++)+(a++)+(a++); d=(++b)+(++b)+(++b); printf("a=%d,b=%d,c=%d,d=%d",a,b,c,d);}结果是什么?而后Eric搜了一下后发现,类似的问题很多,也就是

2、说对自增自减运算符感到迷惑是一个普遍存在的问题,基于此,Eric决定对自增自减运算符做个小小的解析,希望能给C语言爱好者们提供参考,解决对此问题的困惑。自增自减运算符语法自增运算符++使操作数的值加1,其操作数必须为可变左值(可简单地理解为变量)。对于自增就是加1这一点,Eric想大家都不会有什么疑问。问题在于:++可以置于操作数前面,也可以放在后面,如: ++i;  i++;++i表示,i自增1后再参与其它运算;而i++则是i参与运算后,i的值再自增1。自减运算符--与之类似,只不过是变加为减而已,故不重述。实例剖析下面我们通过一些实例来深入理解自增运算符的特性,自减运算符同理自悟

3、例一: inti=3; intj=4; i++; ++j; printf("%d,%d",i,j);对此,Eric想大家都不会有什么困惑,结果就是4,5;下面我们来做一点小改动: inti=3; intj=4; inta=i++; intb=++j; printf("%d,%d",a,b);结果又是多少呢?这里就开始体现出++前置与后置的区别了,结果是3,5。结合此例,我们回头再来理解一下“++前置:i自增1后再参与其它运算;++后置:i参与运算后,i的值再自增1”。很明显,a=i++;由于是先执行赋值运算,再自增,所以结果是a=3,i=4;而b=++j;则因先自增,然后再赋

4、值,所以b,j均为5。其实基本道理就这么简单了,但在更复杂点的情况下又会如何呢,请看:例二: inti=3; intj=4; inta=i+++i++; intb=++j+++j; printf("%d,%d",a,b);问题又来了,i+++i++是先自增一次,相加,再自增,然后赋值呢,还是先相加赋值然后自增两次呢。另外,++j又将如何表现呢?结果是:6,12这下明白了,原来i++的理解应该是执行完整个表达式的其他操作后,然后才自增,所以例子中的a=3+3=6;而后i再自增2次,i=5;相反,++j是先自增然后再参加其它运算,所以b=6+6=12。到此,是否就彻底明了了呢?然后回

5、到引子中的问题:例三: inti=3; intj=4; inta=i+++i+++i++; intb=++j+++j+++j; printf("%d,%d",a,b);有人可能会说,这很简单,我全明白了:a=3+3+3=9,i=6,b=7+7+7=21,j=7。真的是这样吗?结果却是:9,19这下可好,又糊涂了。对于a=i+++i+++i++;我们已经没有疑问了,++后置就是执行完整个表达式的其他操作后,然后才自增,上例中也得到了验证,但b=++j+++j+++j;又该如何理解呢?原理表达式中除了预算法本身的优先级外,还有一个结合性问题。在++j+++j+++j;中,因为存在两个

6、同级的+运算,根据+运算符的左结合性,在编译时,其实是先处理前面的(++j+++j)这部分,然后再将此结果再和++j相加。具体过程参见汇编代码:intb=++j+++j+++j;0040B7DD  mov        ecx,dwordptr[ebp-8]0040B7E0  add        ecx,10040B7E3  mov        dwordptr[ebp-8],ecx //第一个++j0040B7E6  mov        edx,dwordptr[ebp-8]0040B7E9  add        edx,10040B7EC  mov        dwor

7、dptr[ebp-8],edx //第二个++j0040B7EF  mov        eax,dwordptr[ebp-8]0040B7F2  add        eax,dwordptr[ebp-8]  //++j+++j0040B7F5  mov        ecx,dwordptr[ebp-8]0040B7F8  add        ecx,10040B7FB  mov        dwordptr[ebp-8],ecx  //第三个++

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。