从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
问一句自增一在栈中是怎么运算的。