先上问题:
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 | 0、stack中存入常量0 | 0、stack中存入常量0 | 0~12同场景三 |
运算结果 | i=0 | i=1 | i=2 j=1 | i=3 j=3 |
查看java编译字节码文件使用命令:javap -c className
转载请注明来源【IT黑名单】