更改while循环中的条件顺序会导致程序崩溃。如果我这样写:while(a[in-1]>=temp && in>0)
,该程序将不起作用。为什么?错误是:ArrayIndexOutOfBoundsException:-1。以下代码有效,直到我进行上述更改。
public class ISort {
public int[] sort(int[] a){
int n=a.length;
for(int out=1;out<n;out++){
int temp=a[out];
int in=out;
while(in>0 && a[in-1]>=temp ){
a[in]=a[in-1];
in--;
}
a[in]=temp;
}
return a;
}
public static void main(String[] args){
int[] a={3,2,1,6,3,8,8,10,9};
ISort s=new ISort();
int[] res=s.sort(a);
for(int i=0;i<res.length;i++ ){
System.out.print(" "+res[i]+" ");
}
}
}
答案 0 :(得分:5)
如果你写while(in>0 && a[in-1]>=temp)
,那么如果in <= 0
,则不评估第二部分。
为什么?
因为 false&amp;&amp;任何总是 false ,因此如果第一面已被评估为 false ,则检查另一方是多余的。
我认为您在更改订单时AarrayIndexOutOfBoundsException
因为in
为<= 0
并且您仍尝试在否定索引中访问a
。这就是为什么当你想通过一些对象访问一个方法并且你不确定该对象是否为 null 时,你有时会这样做:
if(myVar != null && myVar.myMethod())
答案 1 :(得分:1)
因为如果in
变为0
,那么in - 1
将为-1
,而且数组的索引无效。
while(in>0 && a[in-1]>=temp)
有效,因为
当in > 0
评估为false
时,由于 短路 a[in - 1] >=temp
而未评估
while(a[in-1]>=temp && in>0)
没有,因为
将评估第一个a[in - 1]
,当in
到达0
时,in - 1
将为-1
,这将导致异常-1
不是数组的有效索引,而是抛出ArrayIndexOutOfBoundsException
。
答案 2 :(得分:0)
条件不起作用的原因是while(a[in-1]>=temp && i>0)
数组在in=0
得到负指数。
答案 3 :(得分:0)
考虑in = 0
的情况。将评估的第一件事是a[in - 1] = a[-1] = IndexOutOfBounds
。通过首先检查in
的值,如果in
不大于0,则中止检查数组索引。