2015-11-03 35 views
-1
int x = 3; 
System.out.println(x++ + ++x + x++); // 13 

爲什麼結果13?在複雜語句中如何增加Java運算符的行爲

我的邏輯:

  1. ++x在中心給出4
  2. 4 + 4 + 4 = 12所以其結果必然是12
+5

讓我們永遠不要寫這樣的代碼。沒有人應該在生產代碼中使用這樣的結構。 – duffymo

+0

這是很有趣的分析在Java中,因爲它是明確的。請注意,在C和C++中,行爲是未定義的。 – Bathsheba

+0

x ++確實發佈增量。所以在評估中,值是13 –

回答

7

讓我們把它一步一步。首先重要的是要注意表達式從左到右進行評估,所以沒有未定義的行爲。

int x = 3; 
int res = x++ + ++x + x++ 
// res = (x++) + (++x) + (x++) with x = 3 
// res = 3 + (++x) + (x++) with x = 4 
// res = 3 + 5 + (x++) with x = 5 
// res = 3 + 5 + 5 with x = 6 
// res = 13 

這裏的關鍵部分是:

  • x++返回以前x價值和增值x之後。 JLS section 15.14.2關於「後綴遞增運算符++」說:

    後綴增量表達式的值是新的值存儲在變量前值。

  • ++x返回下一個x遞增值。 JLS section 15.15.1有關「前綴遞增運算符++」說:

    前綴增量表達式的值是新的值存儲在變量後的值。

+0

非常感謝你!你已經完全解釋了! –

3
System.out.println(x++ + ++x + x++); // 13 

        3  5  5 
System.out.println(x++ + ++x + x++); // 13 

x++ - 執行然後遞增so 3

++x - above 3 incremented to 4++ X增量第一然後執行,所以4+1=5

x++ - EXE cutes第一增量以後so x=5被使用,but after this execution x becomes 6

+0

非常感謝!你已經解釋得很好! –

2

x++是增量之前評估的值的表達式。當你看到x++你可以把它看成

int result = x; 
x = x + 1; 
// do something with result. 

++x可以被認爲是

x = x + 1; 
int result = x; 
// do something with result. 

由左到右的問題表達進行評估的。你可以把它想象成

int x = 3 

int result1 = x; // 3 
x = x + 1; 

x = x + 1; 
int result2 = x; // 5 

int result3 = x; // 5 
x = x + 1; 

System.out.println(result1 + result2 + result3); 
+0

謝謝!你已經嘗試了很多! –