JVM笔记:i++ 和++i的字节码原理详解

前言

一个关于i++和++i的原理详解,对字节码不太熟悉的可以先了解下字节码相关知识,因为从字节码角度更能理解两者的原理。

案例

  int i = 0, j = 0;
        i = i++;
        j =++ j;
        System.out.println("args = [" + i + "]");
        System.out.println("args = [" + j + "]");
输出结果:
args = [0]
args = [1]

对于i++,++i可能大家的第一反应的理解是:前者先运算再自增赋值,后者先自增赋值在运算。那么上面那个例子为什么会得出这个结果,下面查看其字节码,输出的我就忽略不展示了。

         0: iconst_0
         1: istore_1
         2: iconst_0
         3: istore_2
         4: iload_1
         5: iinc          1, 1
         8: istore_1
         9: iinc          2, 1
        12: iload_2
        13: istore_2

0 ~ 3行很容易理解,在局部变量保存i和j 分别设值为0。注意看4 ~ 8和9 ~ 13,他们分别代表的是i=i++j=++j。他们之间的差别就在于load指令一个在自增指令`iinc``前,一个在后

这里说一下iinc指令,它是int类型的局部变量自增指令(将后者数据加到前者下标的int类型局部变量中)。可以看到这个指令和下一条指令之间左边的行号是少了两行的,那是因为这个指令显示的是一条,但是干了三件事,读取该值,自增加一,将自增后的值保存回局部变量。

下面开始分析,执行i=i++操作时(4 ~ 8),首先iload_1使局部变量i(0)入栈,然后执行iinc注意,执行完iinc后局部变量表中的i是已经变成1了,iinc并不是吃干饭的,但是前一条指令入栈的值没变,还是0,然后紧接着对i做等号赋值操作的istore_1指令将栈顶的0又保存回了局部变量1(i)中,所以局部变量表中的值变化是:0 ~ 1 ~ 0;

不同的是,执行j=j++操作时(9 ~ 13),先自增后局部变量表中j的值已经变成了1,然后执行=号赋值操作,将++j这一整个iinc后的结果也就是局部变量表2中的值入栈(iload_2),然后赋值给j(istore_2)。

从上面的理解中可以看到俗称的:先运算在赋值和先赋值在运算,其原理就在于iinc指令是否先于局部变量的入栈赋值操作,下面再给几个拓展例子看看。

例一:
       int i = 0, j = 0;
        i=i++ + i++;
        j= ++j + j++; 
例二:
       int i = 0, j = 0;
        j=i++ + i++;

例三:
        int i = 0, j = 0;
        j=i++ + ++i;

例四:
       int i = 0, j = 0;
        j=i++ + ++j;

上面我不列答案,大家可以自己先猜测是多少,然后在看看自己分析的对不对。

虚假的分割线-------------------------------------------------------------------

例一:第一个自增和前面的步骤一样,入栈i然后自增iinc,但是第二个自增会重新把i从局部变量表入栈,此时i经过前面自增已经为1了,然后第二个自增后再赋值,结果就是i=0+1且此时局部变量表中的i值为2(这是等于号赋值前的值,赋值后又重新保存变为1了)。
j的运算我就简要说一下了,和前面类似:先iinc自增运算(差异),然后j(1)入栈,然后出栈保存,再入栈j(1)入栈,自增运算,然后相加。结果是j=1+1,且此时局部变量表中的j为2,下面是字节码:

        4: iload_1
         5: iinc          1, 1
         8: iload_1
         9: iinc          1, 1
        12: iadd
        13: istore_1
        14: iinc          2, 1
        17: iload_2
        18: iload_2
        19: iinc          2, 1
        22: iadd
        23: istore_2

例二:例二和例一不同的是最后的赋值对象从自身变成了其他人,所以这里和例一i运算解析是一模一样的,只不过是最后括号内那句话中的赋值对象变成了j,所以此时i=2,j=1

例三:例三和例一j运算解析也是类似的,同样改变的是最后的赋值对象`,所以此时i=2,j=2

例四:例四虽然有点小不同,但是其原理还是一样的,先入栈i再自增运算i++,此时栈中的i为,0,变量表中的i为1;然后自增运算++j,在入栈j,相加得出结果再保存回变量表,所以结果就是j=0+1,这里得出的j=1是相加运算得出的j=1,并不是自增指令得出的j=1,比如此时i为4的话,结果就是i=5,j=5

         4: iload_1
         5: iinc          1, 1
         8: iinc          2, 1
        11: iload_2
        12: iadd
        13: istore_2

总结

其实以前也看过i++和++i区别的文章,但是看过不就又忘了,最近在学习JVM相关知识,结果字节码对这一原理有了更深的了解,起码在脑子里这个知识点的保质期会久一点。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容