C语言三变量排序功能异常,寻求代码排错及优化方案
问题定位
- 核心问题出在
helper_2的三元表达式分支覆盖不全,三个判断条件没有枚举完所有三个数的大小排序场景,例如输入total=10,a=3,b=2,c=1时,原有三个判断都不成立,helper_2会被赋值为0,触发非法值判断直接返回0,不符合预期。 - 原有求最大、最小、中间值的逻辑冗余,维护成本高,容易出现漏判。
优化方案
可以用极简方式计算三个数的最小、中间、最大值,完全避免漏判问题:
- 最小值直接取三数最小即可,原有
helper逻辑正确 - 最大值直接取三数最大即可,原有
helper_3逻辑正确 - 中间值无需复杂判断,直接用三数之和减去最小值再减去最大值即可得到
优化后代码如下:
#include <stdio.h> int main(void) { int a = 0, b = 0, c = 0, total = 0, min = 0, mid = 0, max = 0; scanf("%d%d%d%d", &total, &a, &b, &c); // 计算最小值 min = (a <= b && a <= c) ? a : (b <= c ? b : c); // 计算最大值 max = (a >= b && a >= c) ? a : (b >= c ? b : c); // 计算中间值,无需复杂判断 mid = a + b + c - min - max; // 合法性判断 if ((total < 0) || (total > 1000) || (min <= 0) || (mid <= 0) || (max <= 0) || (min > 1000) || (mid > 1000) || (max > 1000)) { printf("0"); return 0; } else if ((min + mid + max) <= total) { printf("3"); } else if (min + mid <= total) { printf("2"); } else if (min <= total) { printf("1"); } else { printf("0"); } return 0; }
如果一定要用三元运算符直接判断中间值,全场景覆盖的正确写法可参考:mid = (a >= b && a <= c) || (a <= b && a >= c) ? a : ((b >= a && b <= c) || (b <= a && b >= c) ? b : c);
相比求和计算的方案,这种写法可读性和维护性更低,更易出错。
内容的提问来源于stack exchange,提问作者Game changer
相关产品推荐
相关产品推荐

