i++,++i和i=i++的区别

i=++i,i=i++和i++的区别

1.i=i++与i=++i的区别:i=i++是先赋值再自加,i=++i是先自加再赋值。

如:

 

    public static void main(String[] args) {
        int i=0;
        i=i++;
        System.out.println(i);
    }

运行结果为:

	public static void main(String[] args) {
		int i=0;
		i=++i;
		System.out.println(i);
	}
运行结果为:



2.对于i=++i的运行结果我们可以理解,但是对于i=i++,i最后的运行结果为0,我们可能会感到困惑。那就让我们来看看i=i++的执行流程吧。

反编译得到如下字节码:

public static void main(java.lang.String[]);
  Code:
   0:   iconst_0//定义一个常量0,放入操作数栈
   1:   istore_1//把该常量弹出栈顶存入局部变量表
   2:   iload_1//将该局部变量放入操作数栈
   3:   iinc    1, 1//局部变量自加
   6:   istore_1//再把该常量弹出栈顶存入局部变量表
   7:   getstatic       #16; //Field java/lang/System.out:Ljava/io/PrintStream;
   10:  iload_1
   11:  invokevirtual   #22; //Method java/io/PrintStream.println:(I)V
   14:  return

}

从上面的分析过程中,我们可以看出局部变量在自加前,做了一个 iload_1的动作(将该局部变量放入操作数栈),起到缓存的作用,当局部变量完成自加后,再从操作数栈中将缓存的常量存入局部变量中。因此,i到最后是0。

3.i=i++与i++的区别

	public static void main(String[] args) {
		int i=0;
		i++;
		System.out.println(i);
	}

运行结果为:

反编译得到上面的字节码

public static void main(java.lang.String[]);
  Code:
   0:   iconst_0//定义一个常量0,放入操作数栈
   1:   istore_1//把该常量弹出栈顶存入局部变量表
   2:   iinc    1, 1//局部变量自加
   5:   getstatic       #16; //Field java/lang/System.out:Ljava/io/PrintStream;
   8:   iload_1
   9:   invokevirtual   #22; //Method java/io/PrintStream.println:(I)V
   12:  return

}

与i=i++相比,i++的字节码少了 iload_1和 istore_1,少了一个常量缓存的过程。因此,i++最后的结果为自加后的值1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值