java中i++ ++i字节码解释


先上问题:

int i = 0; i = i++;	

int i = 0; i = ++i;
int i = 0; int j = 0; j = i+++i++;
int i = 0; int j = 0; j = i+++i+++i++;
运算后i和j的值分别是多少;
答案:

i = 0;

i = 1;

i = 2,j = 1;

i = 3,j = 3

下面干货,先看i++在java字节码中是什么样的。

iconst指令将常量压入栈中,0入栈;

istore_1将栈顶int型数值存入第一个局部变量,i=0;

iinc指定int型变量增加指定值,i自身空间自加1。

所以最终i的值为1。

再附两个jvm指令:iload 指定的int型局部变量进栈。iadd 栈顶两int型数值相加,并且结果进栈。


针对开篇问题分析:

 
int i = 0;
i = i++;
int i = 0;
i = ++i;
int i = 0;
int j = 0;
j = i+++i++;
int i = 0;
int j = 0;
j = i+++i+++i++;
字节码





分析
0、stack中存入常量0
1、将栈顶int型数值存入第一个局部变量,即i=0
2、将变量i存入stack
3、i自身空间自增,注意stack中值没变
6、将stack中值赋值给变量i
0、stack中存入常量0
1、将栈顶int型数值存入第一个局部变量,即i=0
2、i自身空间自增
5、将变量i存入stack,注意i已经自增,此时i=1
6、将stack中值赋值给变量i
0、stack中存入常量0
1、将栈顶int型数值存入第一个局部变量,即i=0
2、stack中存入常量0
3、将栈顶int型数值存入第二个局部变量,即j=0
4、将变量i存入stack,stack存入值为0
5、i自身空间自增,i=1
8、将变量i存入stack,stack存入值为1
9、i自身空间自增,i=2
12、栈顶两个值相加 0+1=1,并将结果1进栈
13、将栈顶int型数值存入第二个局部变量,即j=1
0~12同场景三
13、将变量i存入stack,stack存入值为2
14、i自身空间自增,i=3
17、栈顶两个值相加 1+2=3 并将结果3进栈
18、将栈顶int数存入第二个局部变量,即j=3
运算结果i=0i=1i=2 j=1i=3 j=3

查看java编译字节码文件使用命令:javap -c className


转载请注明来源【IT黑名单


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值