java中的自增問題介紹_java

來源:互聯網
上載者:User

運行下面這段代碼,其結果是什麼呢?

package com.test;public class Inc {    public static void main(String[] args) {    Inc inc = new Inc();    int i = 0;    inc.fermin(i);    i = i++;    System.out.println(i);  }  void fermin(int i) {    i++;  }}

結果是:0

上述類似代碼在C/C++中運行結果是:1,這是為什麼呢?
 

這是因為Java使用了中間緩衝變數機制:
i=i++;等同於:
temp=i; (等號右邊的i)
i=i+1;      (等號右邊的i)
i=temp;   (等號左邊的i)
而i=++i;則等同於:
i=i+1;
temp=i;
i=temp;


詳解:

jvm裡面有兩個儲存區,一個是暫存區(是一個堆棧,以下稱為堆棧),另一個是變數區。

jvm會這樣運行這條語句:

步驟1   jvm把i的值(其值是0)拷貝到臨時變數區(temp=0)。

步驟2 變數區i的值加1,這時i的值是1。

步驟3 返回臨時變數區(temp)的值,注意這個值是0,沒修改過。

步驟4 傳回值賦值給變數區的i,此時i的值被重設成0。


 c/c++中沒有另外設定一個臨時變數或是臨時空間來儲存i,所有操作都是在一個記憶體空間中完成的,所以在c/c++中是1。

以上這篇java中的自增問題介紹就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.