从jvm栈帧中区别i++和++i
从jvm栈帧中区别i++和++i
有关jvm的一些详细内容我就不在赘述,那么到底i++和++i的区别体现在哪里呢?
从字节码上来看,i++是iload,iinc,而++i是iinc,iload;
iload是从局部变量表中加载int类型的数据到操作栈中;
iinc是int变量的增值变化,是在局部变量表
中自增的
istore是将操作栈顶的int类型的值弹出,并存入到局部变量表
通过上述的字节码就可以看出,我们平日所说的i++是先赋值再自增,而++i是先自增再赋值.
伪代码:
int i = 0;
i = i++;// 此处的字节码可以翻译为iload,iinc,istore
/*
iload:从局部变量表中加载数字'0'到操作栈中
innc:代表了局部变量表中的变量进行自增操作,此时局部变量表中i=1
istore:将此时操作栈顶的值(0)弹出,存入局部变量表中,并将刚刚自增的值覆盖掉
*/
i = ++i;// 此处的字节码iinc,iload,istore
/*
innc:代表了局部变量表中的变量进行自增操作,此时局部变量表中i=1
iload:从局部变量表中加载数字'1到操作栈中
istore:将此时操作栈顶的值(1)弹出,存入局部变量表中,并将局部变量表中值覆盖掉
*/
虽然道理比较浅显,也是很容易懂的,但是通过这个过程让我知道一些东西,比如:字节码的翻译顺序是=
右边先于左边.后续朋友出了一个题也让我加深了理解了这个过程.代码如下
int i = 1;
i = i++ + ++i + i++ + ++i ;
System.out.println(i);
有兴趣的朋友可以尝试一下,可能个人理解的稍有不对,就关于那个iinc在局部变量表中我个人就表示质疑(真是在局部变量表中么?在表中如何操作的?)欢迎指正.