此代码适用于N = 348,但不适用于N = 349

时间:2020-07-12 09:38:46

标签: arrays c sorting if-statement infinite-loop

为什么排序代码在N = 348时起作用,但是在N = 349程序挂起时呢?没有编译错误。

#define N 348
int main(void){
  int n[N];
  int temp;

  for(int i=0;i<N;i++) n[i] = rand();

  for(int i=0 ; i<N-1;){
    if (n[i]<n[i+1]) {i++;continue;}
    else {
       temp = n[i];
       n[i] = n[i+1];
       n[i+1] = temp;
       if (i != 0) i--;
       else i++;
    }
  }

  return 0;
}

1 个答案:

答案 0 :(得分:4)

程序的行为与N的值无关。

如果数组的两个连续元素彼此相等,则由于这种情况将出现无限循环

if (n[i]<n[i+1]) {i++;continue;}
else {

以及复合else语句中的该语句

if (i != 0) i--;

也就是说,当n[i]等于n[i+1]时,else语句将始终执行。

例如,尝试为阵列运行程序

#define N 3
//...
int n[N] = { 1, 2, 2 };

通过将条件更改为

,可以避免错误
if (n[i]<=n[i+1]) {i++;continue;}
else {