運(yùn)行下面這段代碼,其結(jié)果是什么呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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++中運(yùn)行結(jié)果是:1,這是為什么呢?
這是因?yàn)镴ava使用了中間緩存變量機(jī)制:
i=i++;等同于:
temp=i; (等號(hào)右邊的i)
i=i+1; (等號(hào)右邊的i)
i=temp; (等號(hào)左邊的i)
而i=++i;則等同于:
i=i+1;
temp=i;
i=temp;
詳解:
jvm里面有兩個(gè)存儲(chǔ)區(qū),一個(gè)是暫存區(qū)(是一個(gè)堆棧,以下稱為堆棧),另一個(gè)是變量區(qū)。
jvm會(huì)這樣運(yùn)行這條語(yǔ)句:
步驟1 jvm把i的值(其值是0)拷貝到臨時(shí)變量區(qū)(temp=0)。
步驟2 變量區(qū)i的值加1,這時(shí)i的值是1。
步驟3 返回臨時(shí)變量區(qū)(temp)的值,注意這個(gè)值是0,沒修改過。
步驟4 返回值賦值給變量區(qū)的i,此時(shí)i的值被重置成0。
c/c++中沒有另外設(shè)置一個(gè)臨時(shí)變量或是臨時(shí)空間來保存i,所有操作都是在一個(gè)內(nèi)存空間中完成的,所以在c/c++中是1。
以上這篇java中的自增問題介紹就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。