面試官:你真的清楚 i = i++和 i = ++i 的區別嗎?

爲面阿里P8,我肝了一份651個技術分支的腦圖,要麼?(限時領)

寫在前面:前些天看完了JVM的內存結構,自以爲自己是懂了,心裏想想不就是分線程共享和線程私有嘛,然後又怎麼怎麼分怎麼怎麼的嘛…

直到遇到了這道題目。說句實話,曾經自己做這種運算題目,完全是靠腦子空想,然後拿上筆顫抖的寫下一個自己都不知道正不正確的答案。不過過了今天,我終於能確定它的答案了。

爲此,我也專門寫一篇博客,記錄我的學習!!!

1、題目

package pers.mobian.questions01;

public class test01 {
    public static void main(String[] args) {
        int i = 1;
        i = i++;
        int j = i++;
        int k = i + ++i * i++;
        System.out.println("i="+i);
        System.out.println("j="+j);
        System.out.println("k="+k);
    }
}

你能肯定並且準確的說出你的答案嗎?

2、分析

在做這道題時我們的腦中要有對應的JVM內存結構。其中一個方法對應一個棧幀

【118期】面試官:你真的清楚 i = i++和 i = ++i 的區別嗎?

此題目我們只需要用到棧幀裏面的局部變量表和操作數棧

2.1、第一步

int i = 1

【118期】面試官:你真的清楚 i = i++和 i = ++i 的區別嗎?

只是一個簡單的賦值操作

2.2、第二步

i = i++

【118期】面試官:你真的清楚 i = i++和 i = ++i 的區別嗎?

結果:i還是等於1

2.3、第三步

int j = i++

【118期】面試官:你真的清楚 i = i++和 i = ++i 的區別嗎?

結果:i在局部變量表中變成了2,操作數棧中的 i 值爲1,並且將 i 的值返回給 j,即此條語句以後,i = 2,j = 1

2.4、第四步

int k = i + ++i * i++

【118期】面試官:你真的清楚 i = i++和 i = ++i 的區別嗎?

結果:局部變量表中的i = 4,k = 11

2.5、結果

【118期】面試官:你真的清楚 i = i++和 i = ++i 的區別嗎?

3、i = ++i

按理說根據上面的分析過程,再來分析 i = ++i,就很簡單了。

我們的 i 變量先在局部變量表中進行自增,然後再將 i 進棧,然後再把棧中的數據返回給我們的變量 i 。

public class test02 {
    public static void main(String[] args) {
        int i = 1;
        i = ++i;
        System.out.println(i); // 結果:i = 2
    }
}

最後的最後:本文的思考過程和計算推導僅針對Java語言

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章