i++、++i、i = i++、i = ++i解惑

相关字节码指令

iconst:将一个(-1~5的int型常量)常量加载到操作数栈(当int取值-1~5采用iconst指令,取值-128~127采用bipush指令,取值-32768~32767采用sipush指令,取值-2147483648~2147483647采用 ldc 指令。)
iload:从局部变量表中加载int型的数据到操作数栈中
istore:将一个int型数据从操作数栈存储到局部变量表
iinc:局部变量自增指令

i++

    public void test1() {
        int i = 0;
        i++;
    }
    
    0 iconst_0
    1 istore_1
    2 iinc 1 by 1       局部变量表中i自增
    5 return

++i

    public void test2() {
        int i = 0;
        ++i;
    }
    
    0 iconst_0
    1 istore_1
    2 iinc 1 by 1       局部变量表中i自增
    5 return

i = i++

    public void test3() {
        int i = 0;
        i = i++;
    }
    
    0 iconst_0
    1 istore_1
    2 iload_1           将i压入操作数栈
    3 iinc 1 by 1       局部变量表中i自增
    6 istore_1          将操作数栈中的i赋值到局部变量表(未自增前的值)    
    7 return

i = ++i

    public void test4() {
        int i = 0;
        i = ++i;
    }
    
    0 iconst_0
    1 istore_1
    2 iinc 1 by 1       局部变量表中i自增
    5 iload_1           将i压入操作数栈(已自增的值)
    6 istore_1          将操作数栈中的i赋值到局部变量表
    7 return

pysasuke
199 声望4 粉丝

青铜分段掌控雷电