You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:06:02