通过反汇编class看i++和++i的区别


public void method4() {
int i = 1;
int j = 2;

int a = i++;
int b = ++j;
}





使用javap -c 解开class后



0: iconst_1 //从常量池取出1放入操作栈顶
1: istore_1 //把操作栈顶元素保存到本地变量i中 i=1
2: iconst_2 //从常量池取出2放入操作栈顶
3: istore_2 //把操作栈顶元素保存到本地变量j中 j=2
4: iload_1 //把本地变量i放入操作栈顶i=1
5: iinc 1, 1 //执行把本地变量i+1 ,操作栈顶不变
8: istore_3 //把操作栈顶元素保存到本地变量a中
9: iinc 2, 1 //执行把本地变量j+1 ,操作栈顶不变
12: iload_2 //把本来变量j放入栈顶 j=3
13: istore 4 //把栈顶j保存到本地变量,即b=3
15: return



预备知识:
iconst 把int型数据放到操作栈顶
istore 把栈顶int元素保存到本地变量,移除栈顶元素
iload int本地变量放入栈顶
iinc 把int元素自动+1 如iinc 1,1 第一位是本地变量index,第二位是+的数值
iinc 不会改变栈顶元素的值,它只会改变本地变量的值

不知大家从上面的jvm 指令可以他们之前的不同没?
后++ 的顺序是load ----iinc---store
先++ 的顺序是iinc ----load---store
先前说过iinc不会改变栈顶,会直接修改本地变量的值,所有后++会把先前load的值原封不动的保存进去
而后++会先改变本地变量值,然后把本地变量捞出来,再保存

所以如果++i 和i++ 如果用于自增这两个是没有区别的,都相当于i=i+1,但如果是通过这个来赋值
如 int a = i++; int b = ++j; 那么a保存i原有值,b= j+1


注意
int i = 1; System.out.println(i++);

int i = 1;i++; System.out.println(i);
的区别,原理和上面一样
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值