运行 i=i++
之后,i
的值是多少?代码如下:
public class A{public static void main(String[] args){int i=0;i=i++;System.out.println(i);}}
答案是:打印出 0
为什么呢?是因为java虚拟机中有局部变量区和操作数栈之分。iinc指令是对局部变量区中的整数进行加1,而istone_n是将操作数栈顶元素赋值给n号局部变量
看下字节码就明白了:
首先使用javap -c 命令反编译一下class文件,看下生成的字节码就知道到底发生了什么。字节码如下:
public class A {public A();Code:0: aload_01: invokespecial #1 4: returnpublic static void main(java.lang.String[]);Code:0: iconst_0 //(1) 1: istore_1 //(2) 2: iload_1 //(3) 3: iinc 1, 1 //(4) 6: istore_1 //(5) 7: return
}
(1)定义常量0,在字节码里,-1~5可以表示为iconst_n形式,也就是用常量来表示,不在这个范围的数,则要用bipush n或sipush n来表示,也就是将数存入栈中
(2)istone_n指令可以从栈顶取一个整形数据存储在局部变量区中,n代表在局部变量区中的位置,只能取0,1,2,3,其它的数,则要用istore指令
(3)指定的int型局部变量进栈
(4)局部int型变量增加指定值(而此时栈顶元素的值并没有变化,还是0)
(5)取栈顶元素赋值给局部变量i