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

#include <stdio.h> int main() { int 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; }
这段代码试图找出数组中的最大值和最小值,然后计算它们的差,但存在多个问题。

首先,变量 `n` 在使用前没有赋值,导致数组 `a` 的大小不确定。其次,数组的索引从0开始,循环条件 `i<=n` 会导致越界访问。另外,输入时 `scanf` 需要传入地址,而代码中写成了 `a[i]` 而不是 `&a[i]`。逻辑上,最小值更新条件写成了 `if(a[i]<max)`,这显然不对,应该是与当前最小值比较。最后,计算差值 `b` 并打印的语句放在了循环内部,导致每次迭代都输出一次。

- 检查变量 `n` 是否在使用前被正确赋值,比如先输入 `n` 的值。
- 注意数组索引范围,如果数组有 `n` 个元素,有效索引是0到n-1,循环条件应为 `i < n`。