分支结构与多重选择if 和 switch 的使用一、本篇文章要解决什么问题前面四篇你已经学会了定义变量、输入输出、做简单运算。但程序不能总是一条路走到黑——有时候需要根据条件做不同的事情。这篇文章帮你搞定三件事怎么让程序根据条件选择执行哪段代码——if、if-else、多重 if-else当选项很多时比如菜单选择用 switch-case 怎么写更清晰if 和 switch 分别在什么场景下用最合适学完这篇你的程序就能做判断了——输入一个数字程序知道该走哪条分支。二、先用一个简单例子理解2.1 天气预报和穿衣决策早上起床你打开窗户看看天气然后决定穿什么如果外面在下雨 穿雨衣 否则如果温度低于 10 度 穿羽绒服 否则如果温度低于 20 度 穿外套 否则 穿短袖程序里的分支结构和你这个决策过程一模一样。程序根据一个条件下雨温度来决定走哪条路每条路执行不同的代码。2.2 食堂选餐——switch 的类比学校食堂有 4 个窗口1 号卖面条2 号卖米饭3 号卖饺子4 号卖麻辣烫。你走到窗口前看一眼编号直接去对应的窗口。这就是switch-case的工作方式根据一个变量的值直接跳到对应的分支去执行。三、核心知识点讲解3.1 if 语句——最简单的分支if 语句的结构if(条件){// 条件成立时执行这里的代码}条件是一个表达式结果为 0 表示假非 0 表示真。通常用关系运算符、、等来构造条件。#includestdio.hintmain(void){intscore85;if(score60){printf(及格了\n);}printf(程序结束\n);return0;}运行结果及格了 程序结束如果score改成 50及格了那行就不会输出。图5-1 if-else 分支流程图帮读者建立二选一的直观概念。3.2 if-else——二选一#includestdio.hintmain(void){intscore;printf(请输入成绩);scanf(%d,score);if(score60){printf(及格\n);}else{printf(不及格\n);}return0;}运行结果请输入成绩85 及格if 和 else 之间只能走一条——条件成立走 if 分支不成立走 else 分支。3.3 多重 if-else——多选一#includestdio.hintmain(void){intscore;printf(请输入成绩);scanf(%d,score);if(score90){printf(等级A\n);}elseif(score80){printf(等级B\n);}elseif(score70){printf(等级C\n);}elseif(score60){printf(等级D\n);}else{printf(等级F不及格\n);}return0;}关键理解程序从上往下逐个检查条件。一旦找到一个成立的条件就执行对应的代码然后跳过后面所有的 else if 和 else。比如 score 85满足 80输出 “B”后面的 70、 60不再检查。图5-2 多重 if-else 执行流程图说明从上到下检查命中即停止的规则。3.4 嵌套 if——在分支里再分支#includestdio.hintmain(void){intage;inthasTicket;// 1 表示有票0 表示没票printf(请输入年龄);scanf(%d,age);printf(是否有票1有, 0无);scanf(%d,hasTicket);if(age18){if(hasTicket1){printf(成年人有票可以入场\n);}else{printf(成年人无票请先购票\n);}}else{printf(未成年禁止入场\n);}return0;}3.5 switch-case——多分支的更清晰写法当你需要根据一个变量的具体取值来选择不同分支时switch-case 比多重 if-else 更清晰#includestdio.hintmain(void){intchoice;printf( 简易菜单 \n);printf(1. 查看信息\n);printf(2. 添加信息\n);printf(3. 删除信息\n);printf(4. 退出\n);printf(请选择);scanf(%d,choice);switch(choice){case1:printf(执行查看信息\n);break;case2:printf(执行添加信息\n);break;case3:printf(执行删除信息\n);break;case4:printf(程序退出\n);break;default:printf(输入错误请输入 1~4\n);break;}return0;}switch 的三个关键规则case后面必须是整数常量char 也可以因为 char 本质是整数。不能是浮点数或字符串。break不能忘。如果没有break程序会穿透到下一个 case 继续执行——这叫 fall-through。有时候你确实需要 fall-through比如多个 case 执行同一段代码但大多数情况下加break是正确的。default是可选的但建议写上——用来处理所有意料之外的情况。fall-through 的合理用法switch(month){case1:case3:case5:case7:case8:case10:case12:printf(31 天\n);break;case4:case6:case9:case11:printf(30 天\n);break;case2:printf(28 或 29 天\n);break;}图5-3 switch-case 执行流程图解释 switch 的执行机制和 break 的作用。3.6 if 和 switch 如何选择场景推荐原因条件是一个范围如 score 90if-elseswitch 只能判断等于条件涉及多个变量if-elseswitch 只能判断一个表达式判断一个变量的多个确切取值switch比多重 if 更清晰菜单选择switch一目了然四、完整代码示例下面是一个简易 ATM 取款机模拟程序综合使用 if-else 和 switch#define_CRT_SECURE_NO_WARNINGS#includestdio.hintmain(void){doublebalance1000.0;// 初始余额intchoice;doubleamount;printf( 简易 ATM \n);printf(当前余额%.2f 元\n\n,balance);printf(1. 存款\n);printf(2. 取款\n);printf(3. 查询余额\n);printf(4. 退出\n);printf(请选择操作);scanf(%d,choice);switch(choice){case1:printf(请输入存款金额);scanf(%lf,amount);if(amount0){balanceamount;printf(存款成功当前余额%.2f 元\n,balance);}else{printf(金额无效\n);}break;case2:printf(请输入取款金额);scanf(%lf,amount);if(amount0){printf(金额无效\n);}elseif(amountbalance){printf(余额不足当前余额%.2f 元\n,balance);}else{balance-amount;printf(取款成功当前余额%.2f 元\n,balance);}break;case3:printf(当前余额%.2f 元\n,balance);break;case4:printf(感谢使用再见\n);break;default:printf(输入错误请输入 1~4\n);break;}return0;}图5-4 简易 ATM 程序结构图帮读者理解分支结构中嵌套分支的实际代码结构。五、运行结果 简易 ATM 当前余额1000.00 元 1. 存款 2. 取款 3. 查询余额 4. 退出 请选择操作2 请输入取款金额300 取款成功当前余额700.00 元六、代码逐行解析switch 外层框架switch(choice)switch根据choice的值来分发。choice必须是整数类型。case 1——存款内部嵌套 if-elsecase1:printf(请输入存款金额);scanf(%lf,amount);if(amount0){balanceamount;printf(存款成功当前余额%.2f 元\n,balance);}else{printf(金额无效\n);}break;switch 跳到 case 1然后进入存款逻辑存款内部用了 if-else 做校验金额必须大于 0break跳出 switch避免穿透到 case 2case 2——取款内部嵌套多重 if-elsecase2:...if(amount0){...}elseif(amountbalance){...}else{...}break;三个分支按优先级检查先判断金额是否非法再判断是否超额最后才扣款注意检查顺序不能换——如果先判断amount balance负数金额会绕过去default 分支default:printf(输入错误请输入 1~4\n);break;用户输入了 1~4 之外的数字时走这里。虽然break在最后一个分支可以省略但写上更安全——以后如果在 default 后面再加 case不会出 bug。七、初学者常见错误错误1if 条件后加了分号// 错误写法if(score60);// 分号让 if 变成了空语句{printf(及格\n);}// 输出不管 score 多少都会打印及格// 正确写法if(score60){printf(及格\n);}if 后面的分号表示if 的语句体为空。大括号里的代码和 if 没有关系了变成了无条件执行的代码块。错误2用 代替 // 错误写法if(a5)// 赋值不是判等条件永远为真// 正确写法if(a5)// 判等错误3switch 中忘了写 break// 错误写法switch(n){case1:printf(一\n);case2:printf(二\n);// n1 时也会输出二case3:printf(三\n);}// 正确写法switch(n){case1:printf(一\n);break;case2:printf(二\n);break;case3:printf(三\n);break;}错误4else 和最近的 if 配对悬空 else// 错误理解if(a0)if(b0)printf(都大于 0\n);else// 这个 else 和 if(b0) 配对不是和 if(a0)printf(a 0\n);// 永远不会因为 a0 而执行// 避免歧义始终使用大括号if(a0){if(b0){printf(都大于 0\n);}}else{printf(a 0\n);}错误5switch 的 case 用了浮点数或变量// 错误——case 后面只能是整数常量doublex3.14;switch(x){...}// 浮点数不行switch(n){casea:...}// 变量不行// 正确switch(n){case1:...}// 整数常量可以switch(ch){caseA:...}// 字符常量也可以本质是整数八、练习题练习题1判断闰年用户输入一个年份程序判断是否为闰年输出闰年或平年。闰年规则能被 4 整除但不能被 100 整除或者能被 400 整除。提示year % 4 0 year % 100 ! 0 || year % 400 0练习题2简单计算器用 switch 改写用 switch-case 实现一个四则运算计算器。用户输入两个数和运算符、-、*、/程序输出结果。如果运算符是/且第二个数为 0输出错误提示。练习题3成绩等级分类用户输入成绩0~100 整数程序输出等级90~100 为 A80~89 为 B70~79 为 C60~69 为 D0~59 为 F。如果输入不在 0~100 范围内输出成绩无效。要求先用多重 if-else 实现再用 switch 思考能否实现提示switch 可以配合score / 10来用。九、本篇总结if 做判断else 走另一条路。条件为真非 0走 if为假0走 else多重 if-else 从上到下依次检查一旦命中就跳过后续条件switch 适合判断一个变量的多个取值每个 case 后通常要加breakif 适合范围判断switch 适合等值判断根据场景选择分支可以嵌套但嵌套太深代码难读——考虑提前 return 或拆分逻辑
05_分支结构与多重选择_if和switch的使用
发布时间:2026/5/19 10:10:43
分支结构与多重选择if 和 switch 的使用一、本篇文章要解决什么问题前面四篇你已经学会了定义变量、输入输出、做简单运算。但程序不能总是一条路走到黑——有时候需要根据条件做不同的事情。这篇文章帮你搞定三件事怎么让程序根据条件选择执行哪段代码——if、if-else、多重 if-else当选项很多时比如菜单选择用 switch-case 怎么写更清晰if 和 switch 分别在什么场景下用最合适学完这篇你的程序就能做判断了——输入一个数字程序知道该走哪条分支。二、先用一个简单例子理解2.1 天气预报和穿衣决策早上起床你打开窗户看看天气然后决定穿什么如果外面在下雨 穿雨衣 否则如果温度低于 10 度 穿羽绒服 否则如果温度低于 20 度 穿外套 否则 穿短袖程序里的分支结构和你这个决策过程一模一样。程序根据一个条件下雨温度来决定走哪条路每条路执行不同的代码。2.2 食堂选餐——switch 的类比学校食堂有 4 个窗口1 号卖面条2 号卖米饭3 号卖饺子4 号卖麻辣烫。你走到窗口前看一眼编号直接去对应的窗口。这就是switch-case的工作方式根据一个变量的值直接跳到对应的分支去执行。三、核心知识点讲解3.1 if 语句——最简单的分支if 语句的结构if(条件){// 条件成立时执行这里的代码}条件是一个表达式结果为 0 表示假非 0 表示真。通常用关系运算符、、等来构造条件。#includestdio.hintmain(void){intscore85;if(score60){printf(及格了\n);}printf(程序结束\n);return0;}运行结果及格了 程序结束如果score改成 50及格了那行就不会输出。图5-1 if-else 分支流程图帮读者建立二选一的直观概念。3.2 if-else——二选一#includestdio.hintmain(void){intscore;printf(请输入成绩);scanf(%d,score);if(score60){printf(及格\n);}else{printf(不及格\n);}return0;}运行结果请输入成绩85 及格if 和 else 之间只能走一条——条件成立走 if 分支不成立走 else 分支。3.3 多重 if-else——多选一#includestdio.hintmain(void){intscore;printf(请输入成绩);scanf(%d,score);if(score90){printf(等级A\n);}elseif(score80){printf(等级B\n);}elseif(score70){printf(等级C\n);}elseif(score60){printf(等级D\n);}else{printf(等级F不及格\n);}return0;}关键理解程序从上往下逐个检查条件。一旦找到一个成立的条件就执行对应的代码然后跳过后面所有的 else if 和 else。比如 score 85满足 80输出 “B”后面的 70、 60不再检查。图5-2 多重 if-else 执行流程图说明从上到下检查命中即停止的规则。3.4 嵌套 if——在分支里再分支#includestdio.hintmain(void){intage;inthasTicket;// 1 表示有票0 表示没票printf(请输入年龄);scanf(%d,age);printf(是否有票1有, 0无);scanf(%d,hasTicket);if(age18){if(hasTicket1){printf(成年人有票可以入场\n);}else{printf(成年人无票请先购票\n);}}else{printf(未成年禁止入场\n);}return0;}3.5 switch-case——多分支的更清晰写法当你需要根据一个变量的具体取值来选择不同分支时switch-case 比多重 if-else 更清晰#includestdio.hintmain(void){intchoice;printf( 简易菜单 \n);printf(1. 查看信息\n);printf(2. 添加信息\n);printf(3. 删除信息\n);printf(4. 退出\n);printf(请选择);scanf(%d,choice);switch(choice){case1:printf(执行查看信息\n);break;case2:printf(执行添加信息\n);break;case3:printf(执行删除信息\n);break;case4:printf(程序退出\n);break;default:printf(输入错误请输入 1~4\n);break;}return0;}switch 的三个关键规则case后面必须是整数常量char 也可以因为 char 本质是整数。不能是浮点数或字符串。break不能忘。如果没有break程序会穿透到下一个 case 继续执行——这叫 fall-through。有时候你确实需要 fall-through比如多个 case 执行同一段代码但大多数情况下加break是正确的。default是可选的但建议写上——用来处理所有意料之外的情况。fall-through 的合理用法switch(month){case1:case3:case5:case7:case8:case10:case12:printf(31 天\n);break;case4:case6:case9:case11:printf(30 天\n);break;case2:printf(28 或 29 天\n);break;}图5-3 switch-case 执行流程图解释 switch 的执行机制和 break 的作用。3.6 if 和 switch 如何选择场景推荐原因条件是一个范围如 score 90if-elseswitch 只能判断等于条件涉及多个变量if-elseswitch 只能判断一个表达式判断一个变量的多个确切取值switch比多重 if 更清晰菜单选择switch一目了然四、完整代码示例下面是一个简易 ATM 取款机模拟程序综合使用 if-else 和 switch#define_CRT_SECURE_NO_WARNINGS#includestdio.hintmain(void){doublebalance1000.0;// 初始余额intchoice;doubleamount;printf( 简易 ATM \n);printf(当前余额%.2f 元\n\n,balance);printf(1. 存款\n);printf(2. 取款\n);printf(3. 查询余额\n);printf(4. 退出\n);printf(请选择操作);scanf(%d,choice);switch(choice){case1:printf(请输入存款金额);scanf(%lf,amount);if(amount0){balanceamount;printf(存款成功当前余额%.2f 元\n,balance);}else{printf(金额无效\n);}break;case2:printf(请输入取款金额);scanf(%lf,amount);if(amount0){printf(金额无效\n);}elseif(amountbalance){printf(余额不足当前余额%.2f 元\n,balance);}else{balance-amount;printf(取款成功当前余额%.2f 元\n,balance);}break;case3:printf(当前余额%.2f 元\n,balance);break;case4:printf(感谢使用再见\n);break;default:printf(输入错误请输入 1~4\n);break;}return0;}图5-4 简易 ATM 程序结构图帮读者理解分支结构中嵌套分支的实际代码结构。五、运行结果 简易 ATM 当前余额1000.00 元 1. 存款 2. 取款 3. 查询余额 4. 退出 请选择操作2 请输入取款金额300 取款成功当前余额700.00 元六、代码逐行解析switch 外层框架switch(choice)switch根据choice的值来分发。choice必须是整数类型。case 1——存款内部嵌套 if-elsecase1:printf(请输入存款金额);scanf(%lf,amount);if(amount0){balanceamount;printf(存款成功当前余额%.2f 元\n,balance);}else{printf(金额无效\n);}break;switch 跳到 case 1然后进入存款逻辑存款内部用了 if-else 做校验金额必须大于 0break跳出 switch避免穿透到 case 2case 2——取款内部嵌套多重 if-elsecase2:...if(amount0){...}elseif(amountbalance){...}else{...}break;三个分支按优先级检查先判断金额是否非法再判断是否超额最后才扣款注意检查顺序不能换——如果先判断amount balance负数金额会绕过去default 分支default:printf(输入错误请输入 1~4\n);break;用户输入了 1~4 之外的数字时走这里。虽然break在最后一个分支可以省略但写上更安全——以后如果在 default 后面再加 case不会出 bug。七、初学者常见错误错误1if 条件后加了分号// 错误写法if(score60);// 分号让 if 变成了空语句{printf(及格\n);}// 输出不管 score 多少都会打印及格// 正确写法if(score60){printf(及格\n);}if 后面的分号表示if 的语句体为空。大括号里的代码和 if 没有关系了变成了无条件执行的代码块。错误2用 代替 // 错误写法if(a5)// 赋值不是判等条件永远为真// 正确写法if(a5)// 判等错误3switch 中忘了写 break// 错误写法switch(n){case1:printf(一\n);case2:printf(二\n);// n1 时也会输出二case3:printf(三\n);}// 正确写法switch(n){case1:printf(一\n);break;case2:printf(二\n);break;case3:printf(三\n);break;}错误4else 和最近的 if 配对悬空 else// 错误理解if(a0)if(b0)printf(都大于 0\n);else// 这个 else 和 if(b0) 配对不是和 if(a0)printf(a 0\n);// 永远不会因为 a0 而执行// 避免歧义始终使用大括号if(a0){if(b0){printf(都大于 0\n);}}else{printf(a 0\n);}错误5switch 的 case 用了浮点数或变量// 错误——case 后面只能是整数常量doublex3.14;switch(x){...}// 浮点数不行switch(n){casea:...}// 变量不行// 正确switch(n){case1:...}// 整数常量可以switch(ch){caseA:...}// 字符常量也可以本质是整数八、练习题练习题1判断闰年用户输入一个年份程序判断是否为闰年输出闰年或平年。闰年规则能被 4 整除但不能被 100 整除或者能被 400 整除。提示year % 4 0 year % 100 ! 0 || year % 400 0练习题2简单计算器用 switch 改写用 switch-case 实现一个四则运算计算器。用户输入两个数和运算符、-、*、/程序输出结果。如果运算符是/且第二个数为 0输出错误提示。练习题3成绩等级分类用户输入成绩0~100 整数程序输出等级90~100 为 A80~89 为 B70~79 为 C60~69 为 D0~59 为 F。如果输入不在 0~100 范围内输出成绩无效。要求先用多重 if-else 实现再用 switch 思考能否实现提示switch 可以配合score / 10来用。九、本篇总结if 做判断else 走另一条路。条件为真非 0走 if为假0走 else多重 if-else 从上到下依次检查一旦命中就跳过后续条件switch 适合判断一个变量的多个取值每个 case 后通常要加breakif 适合范围判断switch 适合等值判断根据场景选择分支可以嵌套但嵌套太深代码难读——考虑提前 return 或拆分逻辑