i++

142 阅读1分钟

今天写一个我们非常熟悉i++

public class Inc
{
    public static void main(String[] args) 
    {
        int i=0;
        i=i++;
        System.out.println(i);
    }
}

javap -c Inc.class

Compiled from "Inc.java"
public class Inc {
  public Inc();
    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 //将int型0推送至栈顶
       1: istore_1 //将栈顶int型数值存入第二个本地变量
       2: iload_1  //将第二个int型本地变量推送至栈顶
       3: iinc          1, 1 //将指定int型变量增加指定值(如i++, i–, i+=2等) 将局部变量区1号索引的值加1,操作数栈不发生变化
       6: istore_1 //将栈顶int型数值存入第二个本地变量
       7: getstatic     #2  // Field java/lang/System.out:Ljava/io/PrintStream; 获取指定类的静态域, 并将其压入栈顶
      10: iload_1 ////将第二个int型本地变量推送至栈顶
      11: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
      14: return

结论:i=0 之后i=i++时 将i的值放入了操作数栈 然后i++ 将局部变量的i值增加了1,但是操作数栈的i并没有变化还是等于0,之后将操作数栈的值存给了局部变量的i。