i=i++问题

看下面一道面试题

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值