在线编译器 C

#include <stdio.h> void swap_negmax_last(int size, int a[]) { int o = 0; for (int i = 0 ; i< size; i++) { if (a[0]> -1) { o++; } } if (o == size ) { for(int i = 0 ; i < size; i++) { printf ("%d ", a[i]); } return; } else { int max = -1000, m; for (int i = 0 ; i < size ; i++) { if (a[i] < 0 && a[i] > max) { max = a[i]; m = i; } } int tem = a[m]; a[m] = a[size-1]; a[size-1] = tem; for(int i = 0 ; i < size; i++) { printf ("%d ", a[i]); } return; } } int main() { int size = 10,a[10] = {10, 1, -2, -3, -4, 5, 6, 7, 8, 9, 10}; swap_negmax_last(size, a); return 0; }
这段代码定义了一个函数 `swap_negmax_last`,它的功能是:在整数数组中找出最大的负数(即最接近0的负数),然后把这个数和数组的最后一个元素交换位置。如果数组中没有负数,则直接输出原数组。

代码中存在几个问题:

- 在 `main` 函数中,数组 `a` 被声明为10个元素,但初始化列表却给了11个值,这会导致编译错误或未定义行为。

- 第一个循环中,你检查 `a[0]` 是否大于 -1,但每次循环都只检查同一个元素,而不是检查每个元素。这导致判断数组是否包含负数的逻辑不正确。你应该检查每个元素 `a[i]` 是否非负,而不是只检查 `a[0]`。

- 变量 `max` 初始化为 -1000,这个值可能不够通用。如果数组中的负数都小于 -1000,那么 `max` 就不会被更新。更好的做法是用一个标志变量来记录是否找到了负数,或者将 `max` 初始化为一个非常小的数,比如 `-2147483648`(`INT_MIN`)。