在线编译器 C

#include <stdio.h> int main(void) { int arr[10]; for (int i= 0; i < 10; i++) { scanf("%d", &arr[i]); } int max1 = arr[0]; int max2 = 1; int min1 = arr[0]; int min2 = 1; for (int i = 1; i < 10; i++) { if (arr[i] > max1) { max1 = arr[i]; max2 = i + 1; } if (arr[i] < min1) { min1 = arr[i]; min2 = i + 1; } } printf("%d %d %d %d\n", max1, max2, min1, min2); return 0; }
这段代码的功能是:读取10个整数,找出其中的最大值和最小值,并输出它们的值和位置(位置从1开始计数)。代码逻辑基本正确,但有一个潜在问题。

- 变量 `max2` 和 `min2` 的初始值都设为1,这没问题。但注意,如果数组的第一个元素就是最大值或最小值,那么对应的位置变量会保持为1,这是正确的。
- 关键问题在于:当有多个相同的最大值或最小值时,代码只记录第一次出现的位置,这通常是合理的。但更重要的错误是:`max2` 和 `min2` 的初始值类型不匹配。`max2` 和 `min2` 被声明为 `int`,但初始值 `1` 是整数,这本身没问题。然而,你给 `max2` 赋了 `1`,而 `min2` 也赋了 `1`,但它们的含义是位置,所以初始值应该对应第一个元素的位置,即1,这没问题。但注意,如果数组的第一个元素就是最大值或最小值,那么位置变量会保持为1,这是正确的。但有一个更隐蔽的错误:`max2` 和 `min2` 的初始值应该与第一个元素的位置对应,即1,这没问题。但代码中 `max2` 和 `min2` 的初始值都是1,这没问题。然而,如果数组的第一个元素既是最大值又是最小值(例如所有元素相等),那么 `max2` 和 `min2` 都会是1,输出会正确。但问题在于:当数组的第一个元素不是最大值或最小值时,`max2` 和 `min2` 会被更新,这没问题。所以代码逻辑上似乎没有明显错误。但仔细看,`max2` 和 `min2` 的初始值设为1,但它们的类型是 `int`,而 `1` 是整数,这没问题。实际上,代码的主要问题在于:`max2` 和 `min2` 的初始值应该与第一个元素的位置对应,即1,这没问题。但有一个潜在问题:如果数组的第一个元素是最大值,但后面有更大的值,`max2` 会被更新,这没问题。所以代码看起来正确。但注意:`max2` 和 `min2` 的初始值都是1,