在线编译器 C

#include <stdio.h> enum { SIZE = 10 }; int main() { int A[SIZE]; for (int i = 0; i < SIZE; i++) { scanf("%d", &A[i]); } for (int i = 0; i < 5; i++) { for (int j = i + 1; j < 5; i++) { int temp = A[i]; if (A[i] > A[j]) { A[i] = A[j]; A[j] = temp; } } } for (int i = 5; i < 10; i++) { for (int j = i + 1; j < 10; i++) { int temp = A[i]; if (A[i] < A[j]) { A[i] = A[j]; A[j] = temp; } } } return 0; }
这段代码的目的是:先读入10个整数,然后对前5个元素进行升序排序,对后5个元素进行降序排序。但代码中存在几个关键错误,导致排序无法正确执行。

- 内层循环的更新语句写成了 `i++`,而不是 `j++`。这会导致循环变量 `i` 被意外修改,造成外层循环行为异常,甚至可能陷入死循环。检查所有内层循环的第三部分。

- 交换逻辑有误:你在比较前就把 `A[i]` 存入了 `temp`,但交换时应该用 `temp` 保存被覆盖的值。当前写法在 `A[i] > A[j]` 时,先用 `A[j]` 覆盖了 `A[i]`,然后又把 `temp`(即原来的 `A[i]`)赋给 `A[j]`,这看起来正确,但注意 `temp` 是在循环开始前赋值的,而每次比较时 `A[i]` 可能已经被之前的交换改变了,所以 `temp` 不一定代表当前 `A[i]` 的原始值。建议只在需要交换时再保存临时变量。