读书人

从jvm瞥 i++ 与 ++i 的执行过程

发布时间: 2012-08-21 13:00:21 作者: rapoo

从jvm看 i++ 与 ++i 的执行过程
遇到i++ 与 ++i 你肯定知道i++ 与 ++i i的值都会+1.

public static void main(String[] args) {// TODO Auto-generated method stubint i=0;i=i++;        //这个时候i=0int j=0;j=++j;        //这个时候j=1  }

实际上就是我们常说的运算,赋值先后问题。
/**先运算后赋值i = i + 1;return i;*/++i ; /**先赋值后运算temp = i; i = i + 1;return temp;*/i++;

在命令行输入 javap -c classname >>xxx.txt
可以在xxx.txt看到字节码
public static void main(java.lang.String[]);  Code:   0:iconst_0//将int类型值0压入栈   1:istore_1//从栈中弹出int类型值,然后将其存到位置为1的局部变量(就是i)中   2:iload_1//将位置为1(就是i)的int类型压入栈   3:iinc1, 1//将位置为1(就是i)的int类型的值+1,注意这时,栈顶iload_1的值                    //是0,i的值是1。   6:istore_1//从栈中弹出int类型值(0),然后将其存到i中。i依然是0   7:iconst_0   8:istore_2//从栈中弹出int类型值,然后将其存到位置为2的局部变量(就是j)中   9:iinc2, 1//将位置为2(就是j)的int类型的值+1,注意这时,栈顶istore_2的                    //值是0,j的值是1。   12:iload_2//将位置为2(就是j)的int类型压入栈   13:istore_2//将1存到位置为2的局部变量(就是j)中   14:return


先举个例子
int a=0;int i=100;int j=98;a=i+j;

运行这部分class代码看看
   0:iconst_0   1:istore_1   2:bipush100//将byte(数据类型为byte) 100 转换为int类型,压入栈中   4:istore_2   5:bipush98//将byte(数据类型为byte) 98 转换为int类型,压入栈中   7:istore_3   8:iload_2   9:iload_3   10:iadd//从操作数栈中弹出栈顶的一个字   11:istore_1   12:return


你可以看到iinc 和 iadd 的区别就在于iadd会弹出栈顶的一个字

所以得出结论
i++;//变量i已经完成了自增一,(i++)还没有i++;//变量i已经完成了自增一,++i也就等于i


问一句自增一在栈中是怎么运算的。

读书人网 >编程

热点推荐