2012-07-11 106 views
11

我只是想創建一個小小的Java-Puzzle,但我迷惑了自己。拼圖的一部分是:Java中的前後增量

什麼下面的代碼做:

public class test { 
    public static void main(String[] args) { 
     int i = 1; 
     i += ++i + i++ + ++i; 

     System.out.println("i = " + i); 
    } 
} 

它輸出9

我的(至少部分)錯誤解釋

我不太清楚,但我想i +=後長期被評價是這樣的:

enter image description here

所以

int i = 1; 
i += ++i + i++ + ++i; 

相同
int i = 1; 
i += ((++i) + (i++)) + (++i); 

這從左到右進行評估(請參閱Pre and postincrement java evaluation)。

第一個++i增量爲i2並且返回2。所以,你必須:

i = 2; 
i += (2 + (i++)) + (++i); 

i++返回2,因爲它是i新值,和增量i3

i = 3; 
i += (2 + 2) + ++i; 

第二++i增量i4並返回4

i = 4; 
i += (2 + 2) + 4; 

所以你最終得到12,而不是9

我的解釋中的錯誤在哪裏?什麼是正確的解釋?

+2

你確定它輸出8嗎?因爲我輸出9. – 2012-07-11 11:48:05

+1

感謝您的提示。它輸出9(8是其他難題之一)。然而,9不是12. – 2012-07-11 11:49:15

+1

我得到的輸出爲9! – Patton 2012-07-11 11:49:39

回答

10

i += ++i + i++ + ++i;相同i = i + ++i + i++ + ++i;

右手側從左TO-計算正確,產生i = 1 + 2 + 2 + 4;(產生i = 9)。

+0

所以我的想法是正確的,但'i + = s'得到評估到'i = i + s'這不等於'i = s + i',其中's'是一個語句。正確?你有一個事實來源:「i + = a'被評估爲'i = i + a'? – 2012-07-11 12:44:10

+2

@moose它全部使用Java語言規範:http://docs.oracle。com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2 – jn1kk 2012-07-11 13:21:35

+0

@jsn感謝您爲我鏈接。麋在這裏很好的問題。像這樣的情況是,如果你不知道規範或在哪裏尋找,數學會變得非常模糊。乾杯。 – 2012-07-11 20:52:54

3

您對正確的零件評估是正確的,但您錯過了有關任務的詳細信息。

運行以下命令:

i = i++; 

或本:

i += i++; 

兩次運行後,我仍然有其原始值。

這是因爲我在評估的右邊部分左邊評估左邊。

所以在你的情況下,你加8到1,而不是4。

3

輸出是(try it

int i = 1; 
i += ++i + i++ + ++i; 

變得

i = 1 + 2 + 2 + 4 
1

它很容易理解它是如何工作的,如果你想象它如何在寄存器中存儲值!他把1放在第一個寄存器中,並且通過=符號,並遞增i(++ i),所以現在在我有2個,而在第二個寄存器中有2個,但是第一個寄存器沒有更新,在第三個寄存器中你有2個,然後我遞增,然後我遞增,在最後一個寄存器中你將有4.所以你會有這樣的東西 1 = 2 + 2 + 4 == 9

1

代碼

int i = 1; 
i += ++i + i++ + ++i 

相當於

int tmp1 = i // 1, += 

i ++; // 2 
int tmp2 = i; // 2 

int tmp3 = i; // 2 
i ++; // 3 

i ++; // 4 
int tmp4 = i; // 4 

i = tmp1 + tmp2 + tmp3 + tmp4; // 9 
0

i += ++i + i++ + ++i;

  1. i=1在啓動
  2. i += X - >i = i + X - >i = 1 + X(以便允許計數X)
  3. ++i將被增加至2和return 2
  4. i++return 2然後被遞增到3
  5. ++i將從3增加到4和return 4
  6. X = 2 + 2 + 4 = 8

所以i = 1 + 8 - >i=9


你會得到12,如果你的代碼會是這樣的

int i = 1; 
int tmp = ++i + i++ + ++i; 
i += tmp; 

,因爲你的代碼是i=1,並計算後tmp我會i=4,然後i+=tmp - >i=4+8=12