i++ 和 ++i的字节码指令
代码
public class Test{
	public static void main(String args[]){
	int i=0;
i=i++;
	System.out.println(i);
}
}
输出 0 , 说实话我第一看也打错了,看看字节码
public class Test {
  public Test();
    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_0
       1: istore_1
       2: iload_1
       3: iinc          1, 1
       6: istore_1
       7: getstatic     #2                  // Field java/lang/System.out:Ljava/
io/PrintStream;
      10: iload_1
      11: invokevirtual #3                  // Method java/io/PrintStream.printl
n:(I)V
      14: return
}
指令3 iinc 1,1 直接+1到第二个变量i 中,这时候i=1;
再执行istore_1 把操作数栈写回到变量i, 这时候i又变成0
我们把代码改改
public class Test{
	public static void main(String args[]){
	int i=0;
	//i=i++;
	i=i+1;
	System.out.println(i);
}
}
字节码指令
Compiled from "Test.java"
public class Test {
  public Test();
    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_0
       1: istore_1
       2: iload_1
       3: iconst_1
       4: iadd
       5: istore_1
       6: getstatic     #2                  // Field java/lang/System.out:Ljava/
io/PrintStream;
       9: iload_1
      10: invokevirtual #3                  // Method java/io/PrintStream.printl
n:(I)V
      13: return
}
i=i+1 执行的是iadd指令,这是操作数栈里的字节码指令,把新值1压入到操作数栈,再执行istore_1 把操作数栈回写到变量i, 于是i变成了1
                    
                
                
            
        
浙公网安备 33010602011771号