簡體   English   中英

賦值語句左側的Java后綴增量運算符的語義是什么,為什么它們與右側不同?

[英]What are the semantics of java's postfix increment operator on the left side of an assignment statement and why do they differ from the right side?

我工作在本文給出了問題[1],並發現了一些吸引我眼球。

當我編寫一行代碼時:

nums[i] = nums[(i++)+count];

我通過了所有測試,答案被接受。 但是,如果我將同一行更改為:

nums[i++] = nums[i+count];

我收到了ArrayOutOfBounds異常。 為什么是這樣?

這是完整的代碼:

public void moveZeroes(int[] nums) {
    int count = 0, i = 0;
    while(i+count < nums.length){
        if(nums[i+count] == 0)
            count++;
        else
            nums[i] = nums[(i++)+count];
    }
    for(;i<nums.length; i++)
        nums[i] = 0;
}

[1] https://leetcode.com/problems/move-zeroes/

答案在於JLS 15.26.1 基本上,這是

nums[i++] = nums[i+count];
  • nums被評估(作為左側的一部分)
  • i++進行評估以找到索引; 結果是i的原始值,但隨后i遞增
  • 至此,我們已經評估了要分配給哪個數組元素
  • nums被評估(作為右側的一部分)
  • i+count被評估; 請注意,這使用了已經遞增i值,這就是為什么您遇到異常的原因
  • 現在我們知道要獲取哪個數組元素
  • 獲取該元素的值
  • 將值分配給我們之前確定的LHS元素

重要的是,賦值運算符的左操作數在右操作數上的表達式之前進行求值。 因此,在評估左側操作數中的數組索引表達式時的副作用會影響右側操作數的評估。

在第一個示例中,在迭代中使用完i后,將對其進行遞增。

nums[(i++)+count];

表示在評估nums[(i) + count]的等效項后, i遞增1。

在第二個示例中, inums[ i +count];之前遞增nums[ i +count];

nums[i++]

表示在評估nums[i]的等效項后, i遞增1。

當代碼達到nums[ i + count]; i已經增加了。 i + count等於nums.length的情況下,這將導致ArrayOutOfBounds異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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