Онлайн компилятор C

#include <stdio.h> int main() { int n; scanf("%d",&n); int a[n]; for(int i=0;i<=n-1;i++) { scanf("%d",&a[i]); } if(n==0) { printf("%d",n); return 0; } int max=a[0]; int min=a[1]; if(max<min) {max=a[1] min=a[0]; } for(int i=0;i<=n-1;i++) { if(a[i]>max) { max=a[i]; } if(a[i]<min) { min=a[i]; } } int b=max-min; printf("%d\n",b); return 0; }
这段代码的功能是:读取一个整数 n,然后读取 n 个整数存入数组,最后计算并输出这 n 个数中最大值与最小值的差。

代码中存在一个逻辑错误。当 n 为 1 时,你试图访问 a[1] 来初始化 min,但此时数组只有一个元素 a[0],a[1] 并不存在,这会导致未定义行为。

- 初始化 min 时,不要依赖 a[1],因为当 n 为 1 时 a[1] 是无效的。可以考虑将 min 和 max 都初始化为 a[0]。
- 你额外写了一段交换 max 和 min 的代码,但这是不必要的。如果 min 和 max 都从 a[0] 开始,后续循环会正确更新它们。