2013-05-02 181 views
4

這種行爲背後的邏輯是什麼?i和i = i ++ in for循環java

int i=0; 
    for(int k=0;k<10;k++){ 
    i++; 
    } 
    System.out.println("i="+i); 

Output=10; //Exepcted 



int i=0; 
    for(int k=0;k<10;k++){ 
    i=i++; 
    } 
    System.out.println("i="+i); 

Output=0; //Surprised :) 

任何人都可以拋出上述功能嗎?

+0

是什麼?這是相同的代碼 – Axarydax 2013-05-02 10:21:20

+0

@Axarydax第二個版本有'i = i ++'而不是'i ++' – Rup 2013-05-02 10:21:40

+0

http://stackoverflow.com/questions/7911776/what-is-x-after-xx – NINCOMPOOP 2013-05-02 10:21:45

回答

8

看到這個精彩的回答:

x = x++; 

相當於

int tmp = x; 
x++; 
x = tmp; 

this question

6

i = i++是後綴增量操作 - 它增加i,則返回其原始值(因爲i++基本上是「回報」的i值,然後才遞增)

i = ++i會的工作,因爲它是一個前綴增量運算符,並在增量後返回I的值。但是,您可能只想在那裏執行i++,而無需像第一次運行那樣進行額外的分配 - 它(本質上)簡寫爲i = i+1

3

發生了什麼事情是因爲java是按值傳遞的。

在第一循環中,ii++聲明中得到增加,但是,在第二循環中正在發生的事情是,i被指出到存儲的i值(在這種情況下0 內存位置),然後增加舊的位置。

形象化:

i => 0x00000001 // 0 

for() { 
    i => 0x00000002 <- 0 // store old i value (0) in new location 
    0x00000001++   // Increment the value stored at the old location 

    // Cause there is no longer a reference to 0x00000001, 
    // it will get garbage collected and you will be left with 
    // i => 0x00000002 

而且它將繼續這樣做,指定舊值到一個新的位置和

1

++運算符被處理每個循環過程遞增舊值的分配新建分配FY後,

,如果你改變了它i=++i;你可能會得到您的行爲預期

+0

好吧。但是你不應該推薦一個不好的解決方案。更好的解決方案是'i ++;'或'i + = 1;'或'i = i + 1;'。 – 2013-05-02 11:15:00

+0

yes agree,'i = ++ i;'would never be used in practice – paul 2013-05-02 11:18:05

2

i=i++;將永遠不會增加i,因爲在i = i之後處理++。

你可以看到這樣的:

int i=0; 
for(int k=0;k<10;k++){ 
    int j = 0; 
    i = j; 
    j = j + 1; 
} 
1

在第一選項中,則通過使用i++,這相當於i=i+1遞增I,所以它增加的i的值10
但在第二選項,則assining IA新值,因此每次獲得相同的價值。

2
i = i++; 

相當於,

int temp = i; // temp = 0 
i++; // i=1 
i = temp; // i = 0 
1

I = I ++;

返回i並增加。所以增量輸了...看看這個僞代碼

X = I +將打破在下面的步驟

x = i; 
i++; 

在你的情況下操作,則返回0增量爲1(但是增量丟失)

相關問題