[英]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;
}
答案在於JLS 15.26.1 。 基本上,這是
nums[i++] = nums[i+count];
nums
被評估(作為左側的一部分) i++
進行評估以找到索引; 結果是i
的原始值,但隨后i
遞增 nums
被評估(作為右側的一部分) i+count
被評估; 請注意,這使用了已經遞增的i
值,這就是為什么您遇到異常的原因 重要的是,賦值運算符的左操作數在右操作數上的表達式之前進行求值。 因此,在評估左側操作數中的數組索引表達式時的副作用會影響右側操作數的評估。
在第一個示例中,在迭代中使用完i
后,將對其進行遞增。
nums[(i++)+count];
表示在評估nums[(i) + count]
的等效項后, i
遞增1。
在第二個示例中, i
在nums[ 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.