且说自增自减的前后置

自增自减的前后置?不就是,前置的先自增减后赋值,后置的先赋值后增减吗,事实上并没有那么简单.

    先来看看下面这一C++代码段:

int i = 0;
i = i++ + ++i;
    此时i的值是多少呢?2?不,是3.再看看下面这一代码段:

int i = 0;
i = i + ++i;
    此时i的值为1?对不起,答案是2.也许你会不屑的认为:没人会这样写代码,而且不同的编译器的解释也不同.

   

    我非常同意"没人会这样写代码"的论断,但这不是本文所要考虑的.至于"不同的编译器的解析也不同",我可以负责的说,我们常用的微软的C++编译器和GCC都是这样解释的.

   

    再看看Java对自增自减的前后置的解释吧.

int i = 0;
i = i++ + ++i;
    如果你仍然坚持i为2的话,恭喜你,你是对的. 同样地,对于下面的代码段,执行后i的值是1.
int i = 0;
i = i + ++i;
    至此,我们看到了对前后置的两种截然不同的解释方法:

    一 C++一类的解释.

    此类的解释是前置的自增自减是在表达式的执行前执行的,而后置的自增自减是在表达式的执行后执行的.如何来理解呢?

    对于"i = i + ++i",C++的解释相当于"++i,i = i + i";对于"i = i++ + ++i"C++的解释相当于"++i,i = i + i, i++".这样就可以很好的解释了上面的结果.按照这一理论,执行下面这一代码段后,i的值是4,经过验证,结果确实如此.

int i = 0;
i = ++i + ++i;
    二 Java一类的解释.

    此类的解释,不像C++那样以表达式为分界线来划分前置和后置的执行时机,而是以引用来划分.前置的自增自减是在这一次引用前执行的,后置的操作则是在这一次引用后,下一次引用前执行.

    对于"i = i + ++i",Java的解释相当于"j = i, ++i, k = i, i = j + k";对于"i = i++ + ++i"的解释是"j = i, i++, ++i, k = i, i = j + k".这一种解释符合我们的正常理解.按照这一理论,下面代码执行后, i的值是3.

int i = 0;
i = ++i + ++i;
    C++为什么要如此解释,这一问题值得思考.很明显,C++如此解释,编译后运行性能绝对比Java编译后运行得好.性能正是C++所追求的.C++这样解释虽然运行得快,但很容易出错.而Java,这个内存管理基于引用的语言,为了保证程序的稳健,对前后置作出另一中合乎常理但运行得慢的解释.C++的灵活与Java的稳健可见一斑.

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rucasi/archive/2008/11/09/3260247.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值