j++和++j的结果都是+1,但是在指令级的操作模式完全不一样
以下代码输出结果为:0
public static void main(String[] args) {
int j = 0;
for(int i = 0; i < 10; i++){
j= j++;
}
System.out.println(j);
}
javap -c 类.class会生成以下指令集信息
0: iconst_0 //将int型(0)推送至栈顶 1: istore_1 //将栈顶int型数值存入下标为1的本地变量 2: iconst_0 //将int型(0)推送至栈顶 3: istore_2 //将栈顶int型数值存入下标为2的本地变量 4: goto 15 //跳转到15行 7: iload_1 //将下标为1的int型本地变量推送至栈顶 8: iinc 1, 1 //将下标为1的int型变量增加指定值 (i++, i--, i+=2) 11: istore_1 //将栈顶int型数值存入下标为1的本地变量 12: iinc 2, 1 //将下标为2的int型变量加1 15: iload_2 //将下标为2的int型本地变量推送至栈顶 16: bipush 100 //将单字节的常量值(-128~127)推送至栈顶 18: if_icmplt 7 //比较栈顶两int型数值大小,当结果小于0时跳转到第【7】行 21: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream; //获取指定类的静态域,并将其值压入栈顶 24: iload_1 //将第二个int型本地变量推送至栈顶------------- 25: invokevirtual #22 // Method java/io/PrintStream.println:(I)V //调用实例方法 28: return |
重点指令集解析:
iload_1: j在变量表里面的下标为1,将j的值推到操作数栈中j=0;
iinc :这个操作是在本地变量表里面将j+1;此时j=1;并未改变操作数栈里面j的值
istore_1; j=j++ ; 将操作数栈里面j的值赋给局部变量表里面的j,此时j=0;
将j=j++,改为j=++j;
7: iinc 1, 1 //将下标为1的局部变量(j)加1,此时j=1;
10: iload_1 //将下标为1的局部变量(j)推到操作数栈,此时操作数栈里面,j=1;
11: istore_1 //将操作数栈栈顶的值赋给局部变量表中下标为1的局部变量(j)此时j=1;
最后输入的结果为:10