8

我遇到了這個問題in this website,並在Eclipse中嘗試過,但無法理解它們的評估方式。a + = a ++ * a ++ * a ++ in Java。它如何得到評估?

int x = 3, y = 7, z = 4; 

    x += x++ * x++ * x++; // gives x = 63 
    System.out.println(x); 

    y = y * y++; 
    System.out.println(y); // gives y = 49 

    z = z++ + z; 
    System.out.println(z); // gives z = 9 

根據網站的註釋中,x + = X ++ * X ++ * X ++解析爲X = X +((X + 2)*(X + 1)* X),其結果是正確的。我想我錯過了這個運算符的優先級。

+0

'X + = 3 * 4 * 5; = 3 + 60 = 63'; 'y = 7 * 7 = 49','z = 4 + 5 = 9' – NullUserException

+6

爲什麼這會被投票結束爲一個C++問題的重複? – NullUserException

+2

(我同意NullUserException - C/C++對於處理這個相同的結構有不同的*規則,但是它恰好在Java下很好定義,如果不是醜陋的話。) – 2012-11-13 22:08:27

回答

12

的Java表達式求值留給根據自己的優先級向右&。

int x = 3, y = 7, z = 4; 

x (3) += x++ (3) * x++ (4) * x++ (5); // gives x = 63 
System.out.println(x); 

y = y (7) * y++ (7); 
System.out.println(y); // gives y = 49 

z = z++ (4) + z (5); 
System.out.println(z); // gives z = 9 

後綴增量操作符只在變量被使用/返回後才增加變量。一切似乎都正確。

這是後綴增量操作的僞代碼:

int x = 5; 
int temp = x; 
x += 1; 
return temp; 

從JLS 15.14.2(reference):

The value of the postfix increment expression is the value of the variable before the new value is stored.

+1

感謝你最後的聲明:)使它變得簡單瞭解如何評估++ x。在這個例子之前總是與++ x混淆。 – WilliamShatner

+0

'Java根據它們的優先級從左到右評估表達式'是一個矛盾的術語。 Java評估*操作數*從左到右; *運算符*按照運算符優先級和關聯性的順序進行評估。 – EJP

1

由於後增修改變量值取後和+ =在評估其右手側之前評估其左側,

x += x++ * x++ * x++; 

變得

tmp0 = x 

tmp1 = x 
++x 
tmp2 = tmp1 * x 
++x 
tmp3 = tmp2 * x 
++x 

x = tmp0 + x 
+0

你確定喲是否意味着左手邊在右手邊進行評估,因爲我認爲我知道對面? 代碼分解是好的,除了最後一條語句x = tmp0 + x在x = 3時不會導致63. –

+0

否則它將是66而不是63. – Dan

2

後綴運算符x++意味着像 「給我x的值了,但增加以備將來參考」

因此,由order of operations and evaluation

x++ * x++ * x++

首先解釋爲

3 * 4 * 5(= 60)

然後添加到原來 3,得到63

原始值用於,因爲它是在同一行,假若你寫的是這樣的:

int x = 3; 

int y += x++ * x++ * x++; 
x += y; 

x現在將是66,而不是63,因爲在第二行中的x現在如圖6所示,而不是它的原始3.

1

一元operato RS從左向右計算,所以第一個x++得到值x,第二個是(x+1)等而+ =計算根據在開始時的x值,所以加入x

5

無關,與的運算符優先級本身,只是評估的順序。 兩件事情知道這裏:

  1. x++是後綴增量,所以x值遞增後其被評估
  2. *評估右側則左側。

考慮到點2,表達式x++ * x++ * x++可以更具體地重寫爲x++ * (x++ * (x++))

整個表達式可以寫成的程序:

a = x 
x += 1 
b = x 
x += 1 
c = a*b 
d = x 
x += 1 
return c*d 
+0

謝謝代碼的破解幫助:) –

+0

+1,但帶有挑剔:事實上,運算符優先級在任何地方都有效,在表達式或語句中有多個運算符:)前綴和後綴運算符比二元運算符具有更高的優先級,這就是爲什麼'x ++ * x ++'可以寫**而不用括號**。你必須寫'(x ++)*(x ++)'。沒有運算符優先級和parens,只能從右到左發生,它可能意味着'x ++ *(x ++))'這可能是一個語法錯誤:沒有LHS操作數用於* – quetzalcoatl

+0

好吧,夠公平的。我的意思是,答案應該與postfix和prefix運算符的行爲有關,而不是運算符的優先級,就像混合了不同優先級的許多運算符的表達式一樣(例如,'x ++ * x ++ + x ++/x ++ ') –

2

由於增量操作++是變量x之後加入。這是一個後增量操作。這意味着,x在處理操作後遞增。

In your example the expression would be: 
x += 3 * 4 * 5 
First the expression is added by 3 (x+=....) 
then the first x++ results in 3 
the second x++ results in 4 (because it was incremented before) 
and the third x++ results in 5. 

如果您希望變量遞增之前執行的操作,你必須寫++ X(預增量操作)