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。
本文详细解析了Java中自增运算符`i=i++`与`i++`的区别,通过字节码分析,揭示了两者在内存操作上的差异,并深入探讨了`i=i++`最终结果为0的原因。

被折叠的 条评论
为什么被折叠?



