弄懂Java的自增變量


首先我們來看一段代碼:

    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);
    }

大家可以先不要看下面的答案,寫出自己的答案。

分析

在進行講解前,我們先講解一些基本的概念來幫助我們下面的分析。

概念

首先我們要知道普通我們的語句是如何執行的。

比如i = a + b * c,我們設i = 0a1b2c3

在進行運行時,左邊的i是保存在局部變量中,也就是保存在棧中;而右邊的計算是在操作數棧中進行計算的。

在進行右邊操作數棧計算完畢后,會將結果賦值給左邊對應的局部變量。

第一步

在進行i = i ++進行計算時,會將左邊的放進局部變量,右邊的i++放進操作數棧,然后進行計算。

此時計算i++i++ 操作等於 i = i + 1,所以加1后賦值給局部變量,而操作數棧仍未1

將操作數棧的1賦值給局部變量,所以這一步計算完之后結果仍未1

第二步

​ 此時局部變量中i的值為1 ,現將i放進操作數棧,然后計算i++

計算完i++之后,局部變量中的i2,操作數棧的結果為1

然后將操作數棧中的值賦值給j

第三步

在進行計算之前,i的值為2j的值為1

右邊的三個數字分別要壓入操作數棧,分別是i++ii++

i直接放入是2++i要進行計算,計算后局部變量中的i3,因為是++i,所以放入的也是3i++先放入3,然后計算i++,此時局部變量表中i的值為4

將前一步操作數棧的值計算完之后放入k中即可。

總結

  • 賦值=,最后計算
  • =右邊的從左到右加載值依次壓入操作數棧
  • 實際先算哪個,看運算符優先級
  • 自增、自減操作都是直接修改變量的值,不經過操作數棧
  • 最后的賦值之前,臨時結果也是存儲在操作數棧中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM