Online Compiler 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[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 为 0 时,代码会直接输出 0 并结束。但此时数组 a 的长度为 0,前面的循环 for(int i=0;i<=n-1;i++) 不会执行,所以没有问题。不过,如果 n 为 0,你实际上没有输入任何数字,输出差值 0 是否合理?题目可能要求 n 为正整数,但这里可以思考一下。

- 主要问题在于:如果 n 为 0,你提前返回了,但在此之前已经定义了 int a[n];,当 n=0 时,数组长度为 0,这在 C 语言中是允许的(零长度数组是 GNU 扩展,不是标准 C),但之后你访问 a[0] 来初始化 max 和 min 时,实际上已经因为 if(n==0) 提前返回了,所以不会执行到那里。但代码顺序上,先定义了数组,然后才判断 n==0,如果 n 为 0,数组 a 是空数组,但后续没有使用,所以不会出错。不过更好的做法是先判断 n 是否为 0,再定义数组,避免定义空数组。