2011-09-13 188 views
3

我在java中理解複合賦值運算符和賦值運算符時遇到了一些問題。有人可以向我解釋這兩個運營商真的是如何工作的? (Somwhere我發現了一個非常好的示例代碼,它使用臨時變量來解釋工作,但遺憾的是我失去了它。)非常感謝你的優勢。下面是他們(我已經知道前綴和後綴運營商之間的差)我的小示例代碼:java複合賦值運算符和賦值運算符

 int k = 12; 
     k += k++; 
     System.out.println(k); // 24 -- why not (12+12)++ == 25? 

     k = 12; 
     k += ++k; 
     System.out.println(k); // 25 -- why not (1+12)+(1+12) == 26?    

     k = 12; 
     k = k + k++; 
     System.out.println(k); // 24 -- why not 25? (12+12)++? 

     k = 12; 
     k = k++ + k; 
     System.out.println(k); // 25 -- why not 24 like the previous one? 

     k = 12; 
     k = k + ++k; 
     System.out.println(k); // 25 -- OK 12+(1+12) 

     k = 12; 
     k = ++k + k; 
     System.out.println(k); // 26 -- why? 
+0

邏輯的基礎是++ k的增加是在主操作之前執行的,而在k ++中主要的操作是先執行的。 – 2011-09-13 21:44:23

回答

6

注意,在所有情況下,分配到k 覆蓋在右邊可能發生的任何增量。在線

把評論:

int k = 12; 
    k += k++; 
    System.out.println(k); // 24 

k++意味着增量你已經使用的值後,所以這是相同的編碼k = 12 + 12

k = 12; 
    k += ++k; 
    System.out.println(k); // 25 

++k意味着增量前你使用的值是,所以這與編碼相同k = 12 + 13

k = 12; 
    k = k + k++; 
    System.out.println(k); // 24 

k++意味着增量你已經使用的值後,所以這是相同的編碼k = 12 + 12

k = 12; 
    k = k++ + k; 
    System.out.println(k); // 25 

k++你使用的值後意味着增量,所以這是與編碼相同k = 12 + 13

k = 12; 
    k = k + ++k; 
    System.out.println(k); // 25 

++k意味着增量您使用值之前,所以這是相同的編碼k = 12 + 13

k = 12; 
    k = ++k + k; 
    System.out.println(k); // 26 

++k意味着增量您使用的值,然後將其再次使用之前,所以這是一樣的編碼k = 13 + 13

+0

** + 1 ** - darn,打我吧! – Eric

+0

第四個例子,'k = k ++ + k'應該等於'k = 12 + 13',對吧? – chesles

+0

對不起 - 你是對的(我現在修好了)。有點太複製粘貼繼續:( – Bohemian

0

從這裏一點點完成: http://www.coderanch.com/how-to/java/PostIncrementOperatorAndAssignment

讓我們在該行有什麼密切關注 「I = I ++;」做:

「i ++」被評估。 「i ++」的值是增量發生前i的值。 作爲「i ++」評估的一部分,我增加了1。現在我的值是1; 執行分配。 I是「我+ +」的值,這是我的增量前的值分配 - 即,0 即,「I = I + +」大致翻譯

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

隨着換句話說,它是一個常見的誤解是增量最後發生。當表達式得到評估時,增量立即執行,增量前的值將被記住,以便將來在同一語句中使用。

1

這裏是第一種情況下的詳細說明:

int k = 12; k += k++; System.out.println(k);

k += k++;相當於: k = k + (k++);

k + (k++);從左至右進行評價。
第一個k的值爲12. k++被評估爲k的原始值(即12); k稍後增加。

其他職位做得很好,解釋其他案件。


但這裏是顯示從左至右,右側後增量評價一個有趣的案例:

int k = 12; k = k + k++ + k; System.out.println(k);

k + (k++) + k;從左到右進行評估。
第一個k的值爲12.
第二個k:k++被評估爲k的原始值(即12); k稍後增加。
第三個k:現在k的值增加了13(因爲它在第二個k之後)。
總的結果是37(即12 + 12 + 13)。