簡體   English   中英

Java中復合賦值運算符的操作順序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM