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

C语言多条件if-else逻辑异常:itemCode2、3无法计算菜品总价

问题分析与修复

你的代码中导致 itemCode 2 和 3 无法正常工作的核心问题是运算符优先级错误。在 C 语言中,&& 的优先级高于 ||,因此你写的条件表达式:

if (itemCode == 2 && dish_size == 's' || dish_size == 'S')

会被解析为:

if ((itemCode == 2 && dish_size == 's') || dish_size == 'S')

这意味着只要 dish_size 是 'S',无论 itemCode 是什么,该条件都会成立。虽然在部分测试场景下看似能得到正确结果,但逻辑本质错误——我们需要的是「itemCode 等于指定值并且dish_size 是大小写中的任意一种」,正确写法应给 || 部分加上括号:

if (itemCode == 2 && (dish_size == 's' || dish_size == 'S'))

此外,代码用多个独立 if 语句处理不同菜品的结构,虽未直接引发当前问题,但易引发后续维护隐患;同时 dish_price 未初始化,若用户输入无效规格会导致未定义行为。


修复后的代码

以下是修正优先级、优化结构后的完整代码:

#include <stdio.h>
#include <ctype.h> // 用于tolower函数

int main()
{
    // 声明变量并初始化dish_price
    int itemCode, dish_quantity;
    char dish_size;
    float dish_price = 0.0f, total_price;

    // 显示菜单
    printf("                Menu                \n");
    printf("--------------------------------------------------------------------\n");
    printf("Item Number   Dish             Dish Size              \n");
    printf("                Small(RM)   Medium(RM)   Large(RM)\n");
    printf("--------------------------------------------------------------------\n");
    printf("     1        Ikan Tenggiri       10.00      20.00        30.00\n");
    printf("     2        Ikan Pari            8.00      15.00        25.00\n");
    printf("     3        Ikan Jenahak         9.00      17.00        28.00\n");
    printf("     4        Daging              10.00      20.00        30.00\n");
    printf("--------------------------------------------------------------------\n\n");

    // 输入信息
    printf("Enter item number               : ");
    scanf("%d", &itemCode);
    printf("Enter dish_size (S/M/L)         : ");
    scanf(" %c", &dish_size);
    printf("Enter dish quantity             : ");
    scanf("%d", &dish_quantity);

    // 将规格转换为小写,简化条件判断
    dish_size = tolower(dish_size);

    // 使用switch-case处理不同菜品,逻辑更清晰
    switch(itemCode) {
        case 1:
            if (dish_size == 's') dish_price = 10.00f;
            else if (dish_size == 'm') dish_price = 20.00f;
            else if (dish_size == 'l') dish_price = 30.00f;
            break;
        case 2:
            if (dish_size == 's') dish_price = 8.00f;
            else if (dish_size == 'm') dish_price = 15.00f;
            else if (dish_size == 'l') dish_price = 25.00f;
            break;
        case 3:
            if (dish_size == 's') dish_price = 9.00f;
            else if (dish_size == 'm') dish_price = 17.00f;
            else if (dish_size == 'l') dish_price = 28.00f;
            break;
        case 4:
            if (dish_size == 's') dish_price = 10.00f;
            else if (dish_size == 'm') dish_price = 20.00f;
            else if (dish_size == 'l') dish_price = 30.00f;
            break;
        default:
            printf("Invalid item number!\n");
            return 1; // 非法输入,退出程序
    }

    // 检查规格是否有效
    if (dish_price == 0.0f) {
        printf("Invalid dish size!\n");
        return 1;
    }

    // 输出结果
    printf("Price per dish size             : RM %.2f\n", dish_price);
    total_price = dish_price * dish_quantity;
    printf("Total charge                    : RM %.2f\n\n\n", total_price);

    return 0;
}

主要优化点
  1. 修复运算符优先级:通过括号包裹规格判断,确保逻辑正确性。
  2. 统一规格大小写:用 tolower() 将输入转换为小写,避免重复判断大小写,简化代码。
  3. 使用 switch-case:替代多个独立 if 语句,代码结构更清晰、可读性更强。
  4. 初始化变量:dish_price 初始化为 0.0f,便于后续判断无效输入。
  5. 错误处理:增加对无效菜品编号和规格的判断,避免未定义行为。

内容的提问来源于stack exchange,提问作者Dashvin Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 09:58:08