Онлайн компилятор 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]); } int max=a[0]; int min=a[1]; if(max<min) {max=a[1] min=a[0]; } if(n==0) printf("%d",n); for(int i=0;i<=n;i++) { if(a[i]>max) { max=a[i]; } if(a[i]<min) { min=a[i]; } } int b=max-min; printf("%d\n",b); } printf("Hello, World!\n"); return 0; }
这段代码试图找出数组中最大值和最小值的差,但有几个问题。

首先,代码在 `main` 函数结束后又写了 `printf("Hello, World!\n");` 和 `return 0;`,这些语句在函数外部,会导致编译错误。所有代码都应该在 `main` 函数的花括号内。

其次,逻辑上有几个需要注意的地方:

- 当 `n` 为 0 时,数组为空,但代码中 `int max=a[0];` 会访问不存在的元素,导致未定义行为。应该先处理 `n==0` 的情况,再初始化 `max` 和 `min`。
- 初始化 `min` 为 `a[1]` 也有风险,如果 `n` 小于 2,`a[1]` 同样不存在。通常将 `max` 和 `min` 都初始化为 `a[0]` 更安全。
- 循环 `for(int i=0;i<=n;i++)` 多了一次迭代,数组下标从 0 到 `n-1`,所以条件应为 `i < n`。