【水 Java基础】i=i++底层解析 2019.12.9

i++;

源码

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

i++;字节码

public class Test {
    public Test() {
    }

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

表面理解:i++ => i=i+1

i=i++;字节码

//反编译
public class Test {
    public Test() {
    }

    public static void main(String[] args) {
        int i = 0;
        byte var10000 = i;
        int var2 = i + 1;
        i = var10000;
        System.out.println(i);
    }
}

字节码反编译

// i++;
  public static void main(java.lang.String[]);
    Code:
      stack=2, locals=2, args_size=1
         0: iconst_0                          //1.将常量池中常量'int 0'推送至栈顶
         1: istore_1                          //2.将栈顶 'int 0' 存储至局部变量表Slot插槽1中(i)
         
         2: iinc          1, 1                //3.将 i(Solt 1) increment 加1
         
         5: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         8: iload_1                           //4.加载局部变量表的Solt 1(i)加载到栈顶
         9: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
        12: return
      LineNumberTable:
        line 3: 0
        line 4: 2
        line 5: 5
        line 6: 12
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      13     0  args   [Ljava/lang/String;
            2      11     1     i   I
// i=i++;
  public static void main(java.lang.String[]);
    Code:
      stack=2, locals=2, args_size=1
         0: iconst_0                          //1.栈顶压入 int 0
         1: istore_1                          //2.栈顶 int 0 存入 Solt 1(i) 
         
         2: iload_1							  //3.加载局部变量表的 Solt 1(i = 0) 加载到栈顶
         3: iinc          1, 1				  //4.将 i(Solt 1) increment 加1
         //	iload_1				     		  //  如果,这里再 iload_1 则等式左边的 i 就会刷入1 
         6: istore_1						  //5.栈顶 i = 0 存入 Solt 1(i=1),也就是又刷成 0 
         
         7: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        10: iload_1							  //6.加载局部变量表的 Solt 1(i = 0) 加载到栈顶
        11: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
        14: return
      LineNumberTable:
        line 3: 0
        line 4: 2
        line 5: 7
        line 6: 14
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      15     0  args   [Ljava/lang/String;
            2      13     1     i   I
SourceFile: "Test.java"

实际上,i++ 分两步才能执行完毕的。
i++ =>
tmp = i;,
i = i + 1

解析:i=i++
i = i ++; =>
tmp = i ;,
i=i+1;,
i = tmp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值