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

#include <stdio.h> int main() { int n; scanf("%d",&n); int a[n]; for(int i=0;i<=n;i++) { scanf("%d",a[i]); } int max=a[0]; int min=a[1]; if(max<min) {max=a[1] min=a[0]; } for(int i=0;i<=n;i++) { if(a[i]>max) { max=a[i]; } if(a[i]<max) { min=a[i]; } int b=max-min; printf("%d\n",b); } printf("Hello, World!\n"); return 0; }
这段代码试图找出数组中的最大值和最小值,然后计算它们的差并输出。但代码中存在几个问题。

- 数组索引越界:循环条件 `i<=n` 会导致访问 `a[n]`,而数组有效索引是 `0` 到 `n-1`。同时 `scanf` 中 `a[i]` 缺少取地址符 `&`。
- 最小值初始化逻辑有误:`min` 被初始化为 `a[1]`,如果数组只有一个元素或 `a[1]` 不是最小值,会导致错误。而且后面比较 `a[i]<max` 来更新 `min` 也不正确,应该与 `min` 比较。
- 输出位置不当:`b` 的计算和 `printf` 放在循环内部,每次迭代都会输出,应该只在循环结束后输出一次。

- 检查循环条件,确保只访问有效索引,并给 `scanf` 加上 `&`。
- 重新思考如何正确初始化 `min` 和 `max`,以及更新 `min` 时应该与谁比较。