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; }
主要优化点
- 修复运算符优先级:通过括号包裹规格判断,确保逻辑正确性。
- 统一规格大小写:用
tolower()将输入转换为小写,避免重复判断大小写,简化代码。 - 使用 switch-case:替代多个独立
if语句,代码结构更清晰、可读性更强。 - 初始化变量:
dish_price初始化为 0.0f,便于后续判断无效输入。 - 错误处理:增加对无效菜品编号和规格的判断,避免未定义行为。
内容的提问来源于stack exchange,提问作者Dashvin Kumar
相关产品推荐
相关产品推荐

