自增自减的前后置?不就是,前置的先自增减后赋值,后置的先赋值后增减吗,事实上并没有那么简单.
先来看看下面这一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