[英]Does order of operators matter when using compound assignment in Java? (+= vs =+)
[英]Order of operations for compound assignment operators in Java
最近,我在一次模擬考試中碰到了以下內容,但對於為什么給出的答案是25、25(根據操作順序)以及可能會在規范中缺少詳細說明的原因,我有些困惑。
public class Test {
public static void main(String[] args) {
int k = 1;
int[] a = {1};
k += (k = 4) * (k + 2);
a[0] += (a[0] = 4) * (a[0] + 2);
System.out.println(k + " , " + a[0]);
}
}
僅看上面的第6行,我將替換為適當的值,並獲得以下內容:
k = k + (k = 4) * (k + 2);
我首先評估括號,該括號表示k首先已分配給值4,然后又添加到了數字2,得出的總數為6。這就是我的解釋方式:
k = k + 4 * 6;
現在,這變得令人困惑。 根據操作順序,我得到以下信息,對於前面的表達式,這是正確的:
k = k + 24;
在我看來, k應該是4,因為這是新的賦值,但是答案實際上是25,而不是28。顯然,復合運算符具有某些我不了解的優先順序,或者我的替換原理不正確。
在這個答案中,我將僅考慮k
情況,對於數組來說是相同的。
int k = 1;
k += (k = 4) * (k + 2);
// k += (k = 4) * (k + 2)
// 1 += (k = 4) * (k + 2)
// 1 += 4 * (k + 2) with k = 4
// 1 += 4 * 6 with k = 4
// k = 25
這里的竅門:
k +=
在執行計算之前捕獲k
的值。 +=
稱為復合賦值運算符 。 引用JLS的相關部分:
保存左側操作數的值,然后評估右側操作數。
k = 4
返回分配的值,所以4。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.