Online Compiler C

#include <stdio.h> #define n 10 int main() { int arr[n]; int min_a, max_a, min_b, max_b; for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } min_a = arr[0]; max_a = arr[0]; min_b = 0; max_b = 0; for (int i = 1; i < n; i++) { if (arr[i] < min_a) { min_a = arr[i]; min_b = i; } if (arr[i] > max_a) { max_a = arr[i]; max_b = i; } } printf("%d %d ", min_b, min_a); printf("%d %d ", max_b, max_a); return 0; }
这段代码的功能是:读入10个整数,找出其中最小值和最大值,并输出它们的位置(下标)和数值。

代码中有一个潜在问题:变量 `min_b` 和 `max_b` 的初始值设置。当数组的第一个元素本身就是最小值或最大值时,`min_b` 和 `max_b` 应该记录下标0,但代码中初始化为0,看起来正确。不过,如果数组的第一个元素既不是最小值也不是最大值,那么 `min_b` 和 `max_b` 的初始值0仍然正确,因为循环从下标1开始比较,只有遇到更小或更大的值才会更新下标。

- 检查一下:如果数组所有元素都相等,`min_b` 和 `max_b` 会输出什么?它们是否正确地指向了第一个元素的下标0?
- 思考:代码中 `min_b` 和 `max_b` 的初始值设为0,但 `min_a` 和 `max_a` 也初始化为 `arr[0]`。如果数组的第一个元素就是最小值或最大值,那么下标0会被正确记录。但如果第一个元素不是最小值或最大值,循环中更新下标时也会正确覆盖。所以这个逻辑目前是自洽的。不过,有没有更简洁的初始化方式?比如将 `min_b` 和 `max_b` 直接初始化为0,而不用单独赋值?