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。