汇编语言对i++和++i的分析

++:自加,这是个单目运算符,i++表示先把操作数放入表达式中运算,然后才把操作数加1;++i表示先把操作数加1,然后才把操作数放入表达式中运算。我们已经知道了含义,下面通过几段代码来对其进行更深入的分析

public class Test {

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

}

输出结果是:
1
0
通过javap命令分析main方法中前两行的汇编指令,如下:

public static void main(java.lang.String[]);
  Code:
     0: iconst_0              //push int 0 constant onto the operand stack
     1: istore_1              //store int from operand stack into local variable at index 1
     2: iload_1               //load int from local variable at index 1 and push onto operand stack
     3: iinc          1, 1    //increment the int from the local variable at index indicated by the index byte (unsigned 8-bit integer), with constbyte (signed 8-bit integer)
     6: istore_2              //store int from operand stack into local variable at index 2

注意://后面的是对应指令的解释,可以参考jvm_instruction_set,其余指令比较好理解,但对于iinc需要解释一下,该命令接受两个值,用逗号隔开,第一个值表示局部变量表中变量的下标,第二个值表示增加的值,所以“iinc          1, 1”的含义是,将局部变量表中下标为1的值加1。整个的过程就是:把int类型的值0push到操作数栈中、将操作数栈中的int类型的值存储到局部变量表中下标为1的变量i中(操作完成后的操作数栈为空)、将局部变量表中下标为1的整型值push到操作数栈中、然后在局部变量表中对下标为1的变量i加1、最后把操作数栈中的值存储到局部变量表中下标为2的变量j中,这样就解释明白了。

接下来看另外一段代码

public class Test {

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

}

输出结果是:
1
1
通过查看下汇编指令

public static void main(java.lang.String[]);
  Code:
     0: iconst_0
     1: istore_1
     2: iinc          1, 1
     5: iload_1
     6: istore_2

与上面不同的是,它首先会执行iinc,然后在执行iload_1,即在局部变量表中将i的值加1,然后再赋值给j。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值