java'的语义是什么;赋值语句左侧的s后缀增量运算符,为什么它们与右侧不同?
我正在做一个leetcode问题[1],注意到了一些吸引我眼球的东西 当我将一行代码编写为:java'的语义是什么;赋值语句左侧的s后缀增量运算符,为什么它们与右侧不同?,java,Java,我正在做一个leetcode问题[1],注意到了一些吸引我眼球的东西 当我将一行代码编写为: nums[i] = nums[(i++)+count]; 我通过了所有的测试,我的答案被接受。但是,如果我将同一行更改为: nums[i++] = nums[i+count]; 我得到了一个ArrayOutOfBounds例外。为什么会这样 以下是完整的代码: public void moveZeroes(int[] nums) { int count = 0, i = 0; whi
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;
}
public void movezero(int[]nums){
整数计数=0,i=0;
而(i+计数 对于第一个示例中的(;i,在该迭代中使用完之后,i
将被递增
nums[(i++)+count];
表示在评估nums[(i)+计数]
的等效值后,增量i
在第二个示例中,i
在nums[i+count];
之前递增
nums[i++]
表示在评估nums[i]
的等效值后,增量i
当代码到达nums[i+count];
时,i
已经递增。
如果i+count
等于nums,这将导致ArrayOutOfBounds异常。在第一个示例中,i
在该迭代中使用后递增
nums[(i++)+count];
表示在评估nums[(i)+计数]
的等效值后,增量i
在第二个示例中,i
在nums[i+count];
之前递增
nums[i++]
表示在评估nums[i]
的等效值后,增量i
当代码到达nums[i+count];
时,i
已经递增。
如果i+count
等于nums,这将导致ArrayOutOfBounds异常。答案在于长度。基本上,这是
nums[i++] = nums[i+count];
nums
被评估(作为左侧的一部分)
- 计算
i++
以找到索引;结果是i
的原始值,但i
随后递增
- 此时,我们已经计算了要分配给哪个数组元素
nums
被评估(作为右侧的一部分)
- 将计算
i+count
;请注意,这将使用已递增的i
值,这就是为什么会出现异常
- 现在我们知道要获取哪个数组元素
- 获取该元素的值
- 将该值赋给我们前面标识的LHS元素
重要的一点是赋值运算符的左操作数在右操作数上的表达式之前求值。因此,在左操作数中求值数组索引表达式时的副作用会影响右操作数的求值。答案在于。基本上,这是
nums[i++] = nums[i+count];
nums
被评估(作为左侧的一部分)
- 计算
i++
以找到索引;结果是i
的原始值,但i
随后递增
- 此时,我们已经计算了要分配给哪个数组元素
nums
被评估(作为右侧的一部分)
- 将计算
i+count
;请注意,这将使用已递增的i
值,这就是为什么会出现异常
- 现在我们知道要获取哪个数组元素
- 获取该元素的值
- 将该值赋给我们前面标识的LHS元素
重要的一点是赋值运算符的左操作数在右操作数上的表达式之前求值。因此,在左操作数中求值数组索引表达式时的副作用会影响右操作数的求值。对于更复杂的示例(i=i+=(++i+(i+=2+--i)-++i)
),请参阅。有关更复杂的示例(i=i++=(++i+(i++=2+--i)-++i)
),请参阅。