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

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言自增自减运算符深入剖析 发布日期:2009-03-23?? 来源:Doforfun.net?? 作者:Eric.H.Sento 引子 C语言的自增++,自减--运算符对于初学者来说一直都是个难题,甚至很多老手也会产生困惑,最近我在网上看到一个问题: #include stdio.h void main()? /*主函数*/ { ?int a,b,c,d; ?a=5; ?b=5; ?c=(a++)+(a++)+(a++); ?d=(++b)+(++b)+(++b); ?printf(a=%d,b=%d,c=%d,d=%d\n,a,b,c,d); } 结果是什么? 而后Eric搜了一下后发现,类似的问题很多,也就是说对自增自减运算符感到迷惑是一个普遍存在的问题,基于此,Eric决定对自增自减运算符做个小小的解析,希望能给C语言爱好者们提供参考,解决对此问题的困惑。 自增自减运算符语法 自增运算符 ++ 使操作数的值加1,其操作数必须为可变左值(可简单地理解为变量)。对于自增就是加1这一点,Eric想大家都不会有什么疑问。 问题在于:++ 可以置于操作数前面,也可以放在后面,如: ? ++i; ??i++ ; ++i表示,i自增1后再参与其它运算;而i++ 则是i参与运算后,i的值再自增1。 自减运算符--与之类似,只不过是变加为减而已,故不重述。 实例剖析 下面我们通过一些实例来深入理解自增运算符的特性,自减运算符同理自悟 例一: ? int i=3; ? int j=4; ? i++; ? ++j; ? printf(%d, %d\n, i, j); 对此,Eric想大家都不会有什么困惑,结果就是 4,5;下面我们来做一点小改动: ? int i=3; ? int j=4; ? int a = i++; ? int b = ++j; ? printf(%d, %d\n, a, b); 结果又是多少呢?这里就开始体现出++前置与后置的区别了,结果是3,5。结合此例,我们回头再来理解一下“++前置:i自增1后再参与其它运算;++后置:i参与运算后,i的值再自增1”。很明显,a = i++;由于是先执行赋值运算,再自增,所以结果是a=3,i=4;而b = ++j; 则因先自增,然后再赋值,所以b,j均为5。 其实基本道理就这么简单了,但在更复杂点的情况下又会如何呢,请看: 例二: ? int i=3; ? int j=4; ? int a = i++ + i++; ? int b = ++j + ++j; ? printf(%d, %d\n, a, b); 问题又来了,i++ + i++是先自增一次,相加,再自增,然后赋值呢,还是先相加赋值然后自增两次呢。另外,++j又将如何表现呢? 结果是:6,12 这下明白了,原来 i++的理解应该是执行完整个表达式的其他操作后,然后才自增,所以例子中的a=3+3=6;而后i再自增2次,i=5;相反,++j是先自增然后再参加其它运算,所以b=6+6=12。 到此,是否就彻底明了了呢?然后回到引子中的问题: 例三: ? int i=3; ? int j=4; ? int a = i++ + i++ + i++; ? int b = ++j + ++j + ++j; ? printf(%d, %d\n, 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;中,因为存在两个同级的+运算,根据+运算符的左结合性,在编译时,其实是先处理前面的(++j + ++j)这部分,然后再将此结果再和++j相加。具体过程参见汇编代码: int b = ++j + ++j + ++j; 0040B7DD?? mov???????? ecx,dword ptr [ebp-8] 0040B7E0?? add???????? ecx,1 0040B7E3?? mov???????? dword ptr [ebp-8],ecx? // 第一个++j 0040B7E6?? mov???????? edx,dword ptr [ebp-8] 0040B7E9?? add???????? edx,1 0040B7EC?? mov???????? dword ptr [ebp-8],edx ?// 第二个++j

文档评论(0)

185****7617 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档