2016-08-20 66 views
-1

讓我們考慮java運算符優先級y = x +(x = 10);

int x=1; 
int y1 = (x=10) + x; 
System.out.println(y1); 
// prints 20 

x = 1; 
int y2 = x + (x=10); 
System.out.println(y2); 
// prints 11 

在第一個例子,()首先被執行,因爲它具有最高的優先級;設置x值至10,因此右側操作數(X)獲得的新值10等y1 = 10+10 = 20

在第二個例子中,左邊的操作數的「x」獲取其值1,則()被執行並且x得到它的新值10,所以y2 = 1+10 = 11;

爲什麼在第二個例子中,()沒有被首先執行;所以(x = 10)首先被執行,左邊的操作數x應該被設置爲它的新值10,因此y2 = 20;但它沒有發生這種情況?

+1

不要混淆優先順序和操作數的評估順序。 –

回答

2

我相信這些操作數是從左到右的簡單評估。右側操作數中的括號不會改變左側操作數首先被計算的事實。

+1

不要相信。確定。請參閱[Java語言規範第15.7章評估順序](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.7):* Java編程語言保證運營商的操作數似乎是按照特定的評估順序進行評估的,即**從左至右**。 – Andreas

+0

@安德里亞謝謝! – smarx

0

也許有助於思考int z = f() + g(),即調用兩種方法。爲什麼要先調用g()int z = f() + (g())怎麼樣(介意附加括號)?從左到右是發生了什麼,其中(x=10)只是一個構造,當被評估時,該構造指定給x並將10返回到使用此構造的位置。