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

IT黑名单 2016-11-23 13:52:22

先上问题:

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黑名单

本文链接:http://blog.itblacklist.cn/20161123/8425.html

© Copyright 2016 IT黑名单 Inc.All Rights Reserved. 豫ICP备15018592号-2