你知道java中 i=i++后i的值是多少么?之二
1、如果i++后,不进行赋值操作,i的值为2
下面就来比较一下,这种情况生成的bytecode和上一个有什么不同
先来看看改过后代码吧
Show me the code.
Code:
package chapter4;
/**
* Created by MyWorld on 2016/3/17.
*/
public class IPlusPlusDemo {
public static void main(String[] args) {
int i = 1;
i++;
System.out.println(i);
}
}

2、执行上面的代码,看看执行结果会是多少。
终于是2了。和平时的认知保持一致了

3、看看这种情况的bytecode
命令:
javap -c IPlusPlusDemo.class

4、生成的btyecode:
Compiled from "IPlusPlusDemo.java"
public class chapter4.IPlusPlusDemo {
public chapter4.IPlusPlusDemo();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":
()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1
2: iinc 1, 1
5: getstatic #2 // Field java/lang/System.out:Ljava/
io/PrintStream;
8: iload_1
9: invokevirtual #3 // Method java/io/PrintStream.printl
n:(I)V
12: return
}

5、按照上方的经验,找到相关的bytecode如下:
0: iconst_1 //把int型常量1push到栈中,即int 1现在在栈顶了
1: istore_1 //pop出栈顶的1,给i赋值。执行结束后i存放的值为1
2: iinc 1, 1//自增指令。变量i的值++,即当前i的值为2
所以,现在i的值是2了。
当前bytecode的情况和实际执行的结果是一致的

6、和i=i++时是不是少了两条指令?
少了的两条指令的作用是什么呢?
2: iload_1 //将变量i的值1再压栈,即放到栈顶。这条指令为什么少了呢?是不是进行++运算而进行的特殊处理呢
6: istore_1 //这个就是i=i++中的赋值操作。没有赋值,少了这条指令是对的
