C语言switch case执行所有分支问题排查 四则运算代码示例
问题说明
C语言初学者初次使用switch...case编写简易四则运算计算器,预期流程为:提示用户输入+、-、*、/四类运算符之一,再输入两个操作数,最终输出对应运算的结果。实际运行时,程序匹配到目标运算符的分支后,会顺次执行后续所有case分支和default分支的代码,输出结果不符合预期。
原始代码如下:
#include <stdio.h> int main() { char op; double first, second; printf("Enter an operator (+, -, *, /): "); scanf("%c", &op); printf("Enter two operands: "); scanf("%lf %lf", &first, &second); switch (op) { case '+': printf("%.1lf + %.1lf = %.1lf", first, second, first + second); case '-': printf("%.1lf - %.1lf = %.1lf", first, second, first - second); case '*': printf("%.1lf * %.1lf = %.1lf", first, second, first * second); case '/': printf("%.1lf / %.1lf = %.1lf", first, second, first / second); default: printf("Error! operator is not correct"); } return 0; }
故障原因
C语言的switch...case默认存在*分支穿透(fall-through)*特性:case本质是switch代码块内的位置标签,不是独立代码段的边界。当switch的表达式值匹配到某个case标签后,程序会从该标签位置开始顺序执行后续所有代码,不会在单个case的逻辑执行完毕后自动跳出switch结构。只有显式调用break语句,才能终止当前分支的执行,直接跳出整个switch块。
当前代码的所有case分支末尾都未添加break语句,因此匹配到目标运算符分支后,程序会继续执行后续所有分支的逻辑,导致输出错乱。
额外提示:除法运算需要额外判断除数是否为0,否则会触发除零运行错误。
修复后实现
#include <stdio.h> int main() { char op; double first, second; printf("Enter an operator (+, -, *, /): "); scanf("%c", &op); printf("Enter two operands: "); scanf("%lf %lf", &first, &second); switch (op) { case '+': printf("%.1lf + %.1lf = %.1lf", first, second, first + second); break; case '-': printf("%.1lf - %.1lf = %.1lf", first, second, first - second); break; case '*': printf("%.1lf * %.1lf = %.1lf", first, second, first * second); break; case '/': if (second == 0) { printf("Error! Divisor cannot be 0"); break; } printf("%.1lf / %.1lf = %.1lf", first, second, first / second); break; default: printf("Error! operator is not correct"); } return 0; }
内容的提问来源于stack exchange,提问作者Rui
相关产品推荐
相关产品推荐

