在线编译器 C

#include <stdio.h> int main() { int arr[10]; for (int i = 1; i <= 10; i++) { scanf("%d", &arr[i]); } int max1, max2; if (arr[1] > arr[2]) { max1 = arr[1]; max2 = arr[2]; } else { max1 = arr[2]; max2 = arr[1]; } for (int i = 3; i <= 10; i++) { if (arr[i] > max1) { max1=arr[i]; max1 = max2; } else if(max2<arr[i]); max2 = arr[i]; } } } } printf("%d", max1 + max2); return 0; }
这段代码试图找出数组中最大的两个数并求和,但存在几个问题。

首先,数组索引从0开始,但代码从1到10访问,这会导致越界访问。其次,在循环中更新最大值的逻辑有错误,特别是 `max1 = max2;` 这一行,以及 `else if` 后面多了一个分号。

- 检查数组索引范围:C语言数组索引从0开始,所以 `arr[10]` 是无效的,应该使用 `arr[0]` 到 `arr[9]`。
- 在循环中更新最大值时,当发现新元素比当前最大值大时,应该先将旧的最大值赋给第二大值,再更新最大值。当前代码中 `max1 = max2;` 顺序反了,而且 `else if` 后面多了一个分号,导致条件判断失效。