• 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

  • 相关阅读:
    日期处理工具类
    本地存储
    wangeditor富文本编辑器的使用
    vue+axios 拦截器及使用
    angular引入bootstrap-slider无效问题
    解决vscode导致电脑卡顿问题
    vue组件
    vue框架制作TodoList
    vue框架
    jQuery系列09
  • 原文地址:https://www.cnblogs.com/devilwind/p/8643415.html
Copyright © 2020-2023  润新知