预先增量java

时间:2016-08-18 18:23:27

标签: java

我有以下代码片段。没问题:

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;
}

2 个答案:

答案 0 :(得分:1)

++等于left时,展示位置之间的差异来自 not 正在执行to-1:这意味着++left等于to {1}},<评估为false。反过来,由于less(...)的短路,这导致完全忽略了对&&的调用,从而防止了异常。

当您将++移动到a[++left]时,最终会再次进行一次迭代,当left到达to-1时会抛出越界异常。在预递增之后,left变得等于to,它超出了数组的范围。

答案 1 :(得分:0)

在第二个片段中,第一个条件将评估为真,最大值为to - 1;由于预增量,这将导致第二个条件评估left值等于to。这可能会导致索引超出范围的异常。