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

来源:互联网 发布:淘宝收获日面具 编辑:程序博客网 时间:2024/05/22 12:58

先上问题:

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


原创粉丝点击