在线编译器 C

#include <stdio.h> void swap_negmax_last(int size, int a[]) { int max; int n = 0; for (int i = 0; i < size; i++) { if (a[i] < 0) { max = a[i]; break; } } for (int i = 0; i < size; i++) { if (a[i] < max) { max = a[i]; } } for (int i = 0; i < size; i++) { if (a[i] < 0) { if (a[i] > max) { max = a[i]; n = i; } } } a[n] = a[size - 1]; a[size - 1] = max; for (int i = 0; i < size; i++) { printf("%d ", a[i]); } } int main() { int a[10] = {1, -2, -3, -4, 5, 6, 7, 8, 9, 10}; swap_negmax_last(10, a); return 0; }
这段代码试图找到数组中的最大负数,并将其与最后一个元素交换。但代码中存在逻辑错误,导致结果不正确。

- 第一个循环只找到第一个负数作为初始最大值,但如果没有负数,`max` 未初始化就直接使用,会导致未定义行为。
- 第二个循环寻找比当前 `max` 更小的数(即更负的数),但这里 `max` 已经是负数,`a[i] < max` 会找到更小的负数,这实际上是找最小负数,而不是最大负数。
- 第三个循环试图找最大负数,但条件 `a[i] > max` 在 `max` 是负数时,会找到比当前 `max` 更大的负数,但此时 `max` 已经被第二个循环改成了最小的负数,所以逻辑混乱。

- 提示1:思考“最大负数”的定义:负数中数值最大的那个(例如 -2 比 -5 大)。你的循环条件是否正确地找到了这个值?
- 提示2:如果数组中没有负数,你的代码会怎样?考虑在开始处理前先检查是否存在负数。