i=i++问题

来源:互联网 发布:知其雄,守其雌哲学道理 编辑:程序博客网 时间:2024/05/16 01:26

看下面一道面试题

package Test01;public class Demo02 {    public static void main(String[] args) {        Demo02 demo02=new Demo02();        int i=0;        int j=0;        demo02.show(i);//1        System.out.println("i等于:"+i);        i=i++;//2        System.out.println("i等于:"+i);        j=i++;//3        System.out.println("i等于:"+i+" j等于:"+j);    }    void show(int i){        i++;    }}

结果:
i等于:0
i等于:0
i等于:1 j等于:0

这道题让我困惑了很久,下面我们来分析一下,执行第一句的时候,由于java中基本数据类型是值传递,传递的是实参的副本,所以实参i的值不变。

当执行到第二句时,注意++的优先级高于赋值=,所以先执行i++操作,再进行赋值。参考其他网友的说法,java语言规范里对于++是这样说的:The result of the postfix increment expression is not a variable, but a value.即:++表达式结果是个值,而不是变量。

JVM里面有两个存储区:一个是临时暂存区,一个是变量区,JVM运行第二句的时候,分为三步:

1、把i的值0保存到临时暂存区,临时暂存区为0,变量区的值也为0
2、把i的值加1,这时候i=1,此时临时暂存区的值为0,变量区的变成值为1,
3、由于++表达式的结果是个值,不是变量,所以i++运行完后的值就应该从暂存区去取,暂存区存的是0,把临时暂存区的值0返回给i,所以i=0;

注意此时i=0

当执行第三句的时候。同理,i的值又重新开始保存,j的值是i保存到临时暂存区的值的,此时临时暂存区的值为0,所以j=0,而i的值是从i的变量区取的,i=1。

注意以上分析只对i=i++;j=i++;有效,不能用来分析i=++i; j=++i。

0 0