为什么我实现的忽略-1的getMin函数无法返回浮点数数组的最小值?
问题根因
你的函数存在三个明显问题:
- 核心错误是第二个遍历的
for循环终止条件逻辑错误:你写的i < 10 - i - 1会大幅缩小遍历范围,以你给出的测试用例为例,第一个非-1元素的下标是2,此时10 - i -1的计算结果是7,循环只会遍历下标2到6的元素,下标为7的实际最小值0.001根本不会被纳入判断,所以你最多只能拿到下标4的0.01作为结果。 - 存在边界异常风险:如果数组内所有元素都是-1,第一个循环执行完后
min变量未初始化,直接返回会得到不可预期的垃圾值。 - 注释与实现不符:注释写的是「查找第一个非负值」,但实际逻辑是查找第一个不等于-1的值,二者逻辑不一致,后续维护容易出错。
修复方案
只需要把第二个循环的终止条件修改为遍历完全部10个元素,同时补充全为-1场景的兜底处理即可,修复后代码如下:
#include <stdio.h> float getMin(float arr[10]) { int i = 0; float min; // 查找第一个不等于-1的元素作为初始最小值 for (i; i < 10; i++) { if (arr[i] != -1) { min = arr[i]; break; // 不需要用goto,break完全能实现相同逻辑 } } // 兜底:所有元素都是-1时返回默认值,可根据业务需求调整 if (i == 10) { return -1; } // 遍历剩余所有元素找最小值 for (i; i < 10; i++) { if (arr[i] < min && arr[i] != -1) { min = arr[i]; } } return min; } int main() { float array[10] = { -1, -1, .03, .02, .01, -1, .05, .001, 5, 0.0125 }; printf("Hello World"); float min = getMin(array); printf("min: %f\n", min); // 输出结果为min: 0.001000,符合预期 return 0; }
如果你不需要兼容全为-1的边界场景,也可以只修改第二个for循环的终止条件为i < 10,即可解决当前的返回值错误问题。
内容的提问来源于stack exchange,提问作者Jeremy G
相关产品推荐
相关产品推荐

