java中的自增問題介紹
運行下面這段代碼,其結(jié)果是什么呢?
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++;
}
}
結(jié)果是:0
上述類似代碼在C/C++中運行結(jié)果是:1,這是為什么呢?
這是因為Java使用了中間緩存變量機制:
i=i++;等同于:
temp=i; (等號右邊的i)
i=i+1; (等號右邊的i)
i=temp; (等號左邊的i)
而i=++i;則等同于:
i=i+1;
temp=i;
i=temp;
詳解:
jvm里面有兩個存儲區(qū),一個是暫存區(qū)(是一個堆棧,以下稱為堆棧),另一個是變量區(qū)。
jvm會這樣運行這條語句:
步驟1 jvm把i的值(其值是0)拷貝到臨時變量區(qū)(temp=0)。
步驟2 變量區(qū)i的值加1,這時i的值是1。
步驟3 返回臨時變量區(qū)(temp)的值,注意這個值是0,沒修改過。
步驟4 返回值賦值給變量區(qū)的i,此時i的值被重置成0。
c/c++中沒有另外設置一個臨時變量或是臨時空間來保存i,所有操作都是在一個內(nèi)存空間中完成的,所以在c/c++中是1。
以上這篇java中的自增問題介紹就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring BPP中如何優(yōu)雅的創(chuàng)建動態(tài)代理Bean詳解
這篇文章主要給大家介紹了關于Spring BPP中如何優(yōu)雅的創(chuàng)建動態(tài)代理Bean的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-03-03
Spring Boot部署到Tomcat過程中遇到的問題匯總
這篇文章主要給大家分享了關于Spring Boot部署到Tomcat過程中遇到的一些問題,文中將解決的方法介紹非常詳細,對同樣遇到這個問題的朋友具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-03-03
使用@Valid+BindingResult進行controller參數(shù)校驗方式
這篇文章主要介紹了使用@Valid+BindingResult進行controller參數(shù)校驗方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Java網(wǎng)絡編程UDP實現(xiàn)多線程在線聊天
這篇文章主要為大家詳細介紹了Java網(wǎng)絡編程UDP實現(xiàn)多線程在線聊天,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07
java中對象和Map互相轉(zhuǎn)換的幾種常見方式舉例
Map在日常開發(fā)應用中的頻率很高,最常用的實現(xiàn)類是HashMap和有序的TreeMap,下面這篇文章主要給大家介紹了關于java中對象和Map互相轉(zhuǎn)換的幾種常見方式舉例,需要的朋友可以參考下2024-01-01

