Java中i=i++;运算结果

今天看到一个题,结果和原本想的不太一样,也有些意思,同时也深入地考虑到更多情况。
原本的题大体如下,
以下程序的输出结果是什么?
Class Test{
  public static void main(String [] args){
      int i = 0;
      i = i++;
      System.out.println(“i=”+i);
   }
}
答案是 i=0;
刚开始是思考的时候认为答案是i=1,到来是看答案是1,不信,又自己写了代码,果然是0,却不清楚原因,后来和同学讨论了下,猜想是编译器的原因。
这段代码的在编译的过程中为赋值语句的左边可以看作设置了一个临时变量,i=i++运算过程可分解如下:(临时变量设置为temp)
temp = i++;(temp = 0,这一部可以分解为temp = i;i++;)
i = temp;(i=0)
后来在网上查了一下,根据java中JVM对这道题有以下解析(引用http://www.cnblogs.com/wangjisi/archive/2010/06/06/1752600.html)
jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。
语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值);语句iload_1是将变量区中的值暂存如堆栈中。
因为i = i++;是先将i的值(1)存入堆栈,然后对变量区中的i自加1,这时i的值的确是2,但是随后的istore_1又将堆栈的值(1)弹出赋给变量区的i,所以最后i =1。
又因为i = ++i;是先对变量区中的i自加1,然后再将变量区中i的值(2)存入堆栈,虽然最后执行了istore_1,但也只是将堆栈中的值(2)弹出赋给变量区的i,所以i = ++i;的结果是i = 2。

在C#中也有同样的问题,值是也是0。但是c/c++的运算结果却是 1.
原因是c/c++中没有另外设置一个临时变量或是临时空间来保存i,所有操作都是在一个内存空间中完成的。

以下是在网上搜索到的关于该问题的一些解析:
http://www.cnblogs.com/wangjisi/archive/2010/06/06/1752600.html
http://deshell.blog.163.com/blog/static/14095443420108165240503/?fromdm&isFromSearchEngine=yes
http://piaoboqiu.blog.163.com/blog/static/123127827200910192122472/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值