从jvm栈帧中区别i++和++i

xiaoxiao2022-07-06  46

从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在局部变量表中我个人就表示质疑(真是在局部变量表中么?在表中如何操作的?)欢迎指正.

转载请注明原文地址: https://www.6miu.com/read-4968477.html

最新回复(0)