Онлайн компилятор 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]; } if(n==0) printf("%d",n); 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; }
这段代码试图读取一组整数,然后计算它们的最大值与最小值的差。但代码中有几处逻辑错误和语法问题。

- 第一个循环 `for(int i=0;i<=n;i++)` 会多读一个数,因为数组大小是 `n`,有效下标是 `0` 到 `n-1`。当 `i` 等于 `n` 时,访问 `a[n]` 越界。
- 初始化 `min` 为 `a[1]` 有问题:如果 `n` 小于 2,`a[1]` 不存在;而且 `min` 的初始值应该与 `max` 一样从 `a[0]` 开始,或者用更稳妥的方式。
- 第二个循环中 `if(a[i]<max)` 这个条件不对,它只会在元素小于当前最大值时更新 `min`,但 `min` 应该记录最小值,而不是比 `max` 小的任意值。应该用 `if(a[i] < min)` 来更新最小值。
- 代码末尾多了一个多余的 `}`,导致 `printf("Hello, World!\n");` 和 `return 0;` 不在 `main` 函数内。

- 检查 `if(max<min)` 交换的逻辑:这个交换只在数组前两个元素顺序不对时有用,但更好的做法是直接让 `max` 和 `min` 都从 `a[0]` 开始,然后遍历所有元素更新。