我有以下代码片段。没问题:
while (++left < to && less(a[left], a[from]));
其中left是一些数组索引,less(a,b)是辅助函数,返回true iff a&lt; = b; a - array [from&lt; = array index&lt;到]
我特别不理解上面代码的区别:
while (left < to && less(a[++left], a[from]));
正如我所读到的那样,在整个表达式之前,预先计算evaluetes,但事实并非如此(当我第一次使用它时,我得到了超出范围的异常)。 请有人澄清一下这个问题吗?
APPEND: 代码少:
private boolean less(T a, T b) {
return a.compareTo(b) <= 0;
}
答案 0 :(得分:1)
当++
等于left
时,展示位置之间的差异来自 not 正在执行to-1
:这意味着++left
等于to
{1}},<
评估为false
。反过来,由于less(...)
的短路,这导致完全忽略了对&&
的调用,从而防止了异常。
当您将++
移动到a[++left]
时,最终会再次进行一次迭代,当left
到达to-1
时会抛出越界异常。在预递增之后,left
变得等于to
,它超出了数组的范围。
答案 1 :(得分:0)
在第二个片段中,第一个条件将评估为真,最大值为to - 1
;由于预增量,这将导致第二个条件评估left
值等于to
。这可能会导致索引超出范围的异常。