目录

一、switch语句基础

基本语法结构:

在C/C++中:

注意事项:

二、if与switch语句对比

示例:计算整数除以3的余数

使用if语句实现:

使用switch语句实现:

三、break语句的作用

示例(无break的情况):

练习:输入1-7的数字,输出对应的星期名称

参考代码:

需求变更后:

修改后的参考代码:

四、default子句

五、注意事项


一、switch语句基础

        除了if语句外,C语言还提供了switch语句来实现分支结构。switch语句是一种特殊形式的if-else结构,专门用于处理多条件分支的情况,它能够将复杂的else-if结构转换为更易用、可读性更好的形式。

基本语法结构:

switch (expression) {case value1: statement1;break;case value2: statement2;break;...default: default_statement;break;
}

        上述代码根据 expression 的不同取值执行对应的 case 分支。若未匹配到任何值,则执行 default 分支。

        在大多数编程语言中,switch 语句的 case 标签右边的值(value)通常是 整型(int) 或可以隐式转换为整型的类型(如 charenum,但具体规则取决于语言。

在C/C++中:

  • case 值必须是整型常量表达式(如 intcharenum)。

  • 字符类型(char)也是归类到整型家族,因为字符的本质ASCII码值,这个值是整数。

  • 不允许字符串、浮点数或变量(C++11 后允许 constexpr)。

    switch (x) {case 1:         // 合法(整型)case 'a':       // 合法(char 隐式转 int)case ENUM_VAL:  // 合法(enum 隐式转 int)// case 1.5:     // 非法(浮点数)break;
    }

注意事项:

  1. switch后的表达式(expression)必须是整型表达式

  2. case后的值必须是整型常量表达式

  3. case和值之间必须有空格

  4. 每个case语句执行完毕后通常需要添加break以跳出switch结构


二、if与switch语句对比

示例:计算整数除以3的余数

使用if语句实现:

#include <stdio.h>
int main() {int n = 0;scanf("%d", &n);if(n%3 == 0)printf("整除,余数为0\n");else if(n%3 == 1)printf("余数是1\n");elseprintf("余数是2\n");return 0;
}

使用switch语句实现:

#include <stdio.h>
int main() {int n = 0;scanf("%d", &n);switch(n%3) {case 0:printf("整除,余数为0\n"); break;case 1:printf("余数是1\n"); break;case 2:printf("余数是2\n"); break;}return 0;
}

在编写代码时,需要注意以下关键点:

  1. case关键字与后续数字之间必须保留空格
  2. 每个case语句块执行完毕后,必须添加break语句才能正确退出switch结构

三、break语句的作用

        在switch语句中,break用于终止当前case的执行并跳出整个switch结构。如果省略break,程序会继续执行下一个case中的语句,这种现象称为"case穿透"。

示例(无break的情况):

#include <stdio.h>
int main() {int n = 0;scanf("%d", &n);switch(n%3) {case 0:printf("整除,余数为0\n"); case 1:printf("余数是1\n"); case 2:printf("余数是2\n"); }return 0;
}

当输入7时(7%3=1),输出将是:

        我们发现程序在计算7除以3时,本该显示余数为1,但运行结果却多输出了"余数是2"的信息。这到底是什么原因呢?

        问题出在switch语句的分支机制上。switch语句需要配合break才能实现真正的分支效果。当某个case语句后缺少break时,程序会继续向下执行,可能进入其他case的代码块,直到遇到break或switch语句结束。例如在上述代码中,程序就意外执行了case 2的语句。

        因此,在switch语句中合理使用break至关重要,它能确保正确的分支控制。不过需要注意的是,并非每个case都必须包含break,这需要根据具体业务逻辑来决定。

练习:输入1-7的数字,输出对应的星期名称

示例: 输入1 → 输出"星期一" ;输入2 → 输出"星期二" ;输入3 → 输出"星期三" ;输入4 → 输出"星期四" ;输入5 → 输出"星期五" ;输入6 → 输出"星期六" ;输入7 → 输出"星期天"

参考代码:

#include <stdio.h>
int main() {int day;scanf("%d", &day);switch(day) {case 1: printf("星期一\n"); break;case 2: printf("星期二\n"); break;case 3: printf("星期三\n"); break;case 4: printf("星期四\n"); break;case 5: printf("星期五\n"); break;case 6: printf("星期六\n"); break;case 7: printf("星期天\n"); break;}return 0;
}

需求变更后:

  1. 输入1-5时输出"工作日"
  2. 输入6-7时输出"休息日"

修改后的参考代码:

#include <stdio.h>
int main() {int day;scanf("%d", &day);switch(day) {case 1:case 2:case 3:case 4:case 5: printf("工作日\n"); break;case 6:case 7: printf("休息日\n"); break;}return 0;
}

        通过这个练习可以看出,在实际编码时需要根据具体需求来决定break语句的使用位置,这样才能正确实现功能需求。


四、default子句

        当switch表达式的值与所有case都不匹配时,会执行default子句中的代码。default不是必须的,但建议总是包含它以处理意外情况。

switch (expression) 
{
case value1:statement;break;
case value2:statement;break;
default:statement;
}

当 expression 的值既不是 value1 也不是 value2 时,程序将执行 default 子句中的代码。

        比如之前的打印星期练习,当输入的 day 值不在1到7范围内时,若要提示"输入错误",可以这样编写代码:

#include <stdio.h>
int main() {int day = 0;scanf("%d", &day);switch(day) {case 1:printf("星期一\n");break;// ... 其他星期 ...case 7:printf("星期天\n");break;default:printf("输入错误,请输入1-7的数字\n");break;}return 0;
}

工作日与休息日判断:

#include <stdio.h>
int main() {int day = 0;scanf("%d", &day);switch(day) {case 1:case 2:case 3:case 4:case 5:printf("工作日\n");break;case 6:case 7:printf("休息日\n");break;default:printf("输入错误\n");break;}return 0;
}

五、注意事项

  1. case和default的顺序可以任意排列,但通常将default放在最后

  2. case穿透有时是有意为之(如上面的工作日示例),但大多数情况下需要添加break

  3. switch语句只能处理离散的整数值,不能处理范围判断(如x > 10)

  4. 多个case可以共享同一组执行语句

通过合理使用switch语句,可以使多分支结构的代码更加清晰、易于维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92914.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92914.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92914.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【03】厦门立林科技——立林科技 嵌入式 校招笔试,题目记录及解析

厦门立林科技——立林科技 嵌入式 校招笔试&#xff0c;题目记录及解析 1.下面的程序的输出是&#xff08;&#xff09;。2.在头文件中#ifndef/#define/#endif的作用是4.执行下面程序中的输出语句后,输出的结果是()6.在32位处理器上,运行如下程序后p的值为()。10.设有两字符串“…

C++算法(数据结构)版

C算法&#xff08;数据结构&#xff09;版 有些题目不是完整的题目&#xff0c;如需查看完整的题目请移步到acwing的算法基础课中 文章目录C算法&#xff08;数据结构&#xff09;版单链表思路&#xff1a;双链表思路&#xff1a;栈思路&#xff1a;队列思路&#xff1a;单调栈…

算法训练营DAY57 第十一章:图论part07

prim算法精讲 53. 寻宝&#xff08;第七期模拟笔试&#xff09; 题目描述&#xff1a; 在世界的某个区域&#xff0c;有一些分散的神秘岛屿&#xff0c;每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路&#xff0c;方便运输。 不同岛屿之间&#xff0c;…

最短路问题从入门到负权最短路

一&#xff0c;BFS层次最短路/*题目描述 题目描述 给出一个 N 个顶点 M 条边的无向无权图&#xff0c;顶点编号为 1∼N。 问从顶点 1 开始&#xff0c;到其他每个点的最短路有几条。 输入格式 第一行包含 2 个正整数 N,M&#xff0c;为图的顶点数与边数。 接下来 M 行&#xff…

AI智能体小白入门指南

AI智能体小白入门指南 ——什么是AI智能体&#xff1f;它们如何工作&#xff1f; 一、AI智能体是什么&#xff1f; AI智能体&#xff08;AI Agent&#xff09;是能感知环境、自主决策并执行动作的人工智能系统。 类比理解&#xff1a;像一个“虚拟机器人”或“数字助手”&#…

《设计模式》策略模式

1.策略模式定义 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一组算法&#xff0c;将每个算法封装起来&#xff0c;并使它们可以相互替换&#xff0c;从而让算法的变化独立于使用它的客户&#xff08;Client&#xff09;。 换…

AWS DMS 深度解析:从迁移任务到复制任务 - 全流程指南与最佳实践

AWS Database Migration Service (DMS) 是一项强大的云服务,用于在源数据库和目标数据库之间安全地迁移数据。其核心优势在于支持几乎零停机时间的迁移,这主要归功于其“变更数据捕获 (CDC)”功能。理解迁移任务 (Migration Task) 和复制任务 (Replication Task) 的关系与操作…

国企社招 | 中国邮政2025年社会招聘开启

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 原文链接&#xff1a;“邮”你“政”好 | 广东邮政2025年社会…

linux添加自启动

linux添加自启动 配置步骤&#xff1a; 创建systemd服务文件 sudo nano /etc/systemd/system/tme-vod.service将下面artifact中的内容复制到该文件中。 [Unit] DescriptionTME VOD Service Afternetwork.target[Service] Typesimple Userroot Grouproot WorkingDirectory/data/…

轻量级解决方案:如何高效处理Word转PDF?

文档格式转换时&#xff0c;手动逐个处理总显得效率低下。它的体积小巧&#xff0c;不到1MB&#xff0c;且无界面设计&#xff0c;运行极简&#xff1a;将其与Word文件放入同一目录&#xff0c;双击启动&#xff0c;程序便会自动完成所有文档的PDF转换。操作零复杂度&#xff0…

Redis 数据倾斜

Redis 数据倾斜指的是在 Redis 集群模式下&#xff0c;数据&#xff08;以及相应的访问请求和负载&#xff09;在各个分片&#xff08;Shard&#xff09;之间分布严重不均匀的现象。这会导致部分节点成为热点或超载&#xff0c;而其他节点资源闲置&#xff0c;最终引发性能瓶颈…

Java基础-TCP通信(多发多收和一发一收)

目录 案例要求&#xff1a; 实现思路&#xff1a; 代码&#xff1a; User:客户端 Client:服务端 总结&#xff1a; 案例要求&#xff1a; 实现TCP通信的多发多收和一发一收,多发多收去掉各自的while循环就是一发一收,本文只模拟一发一收 实现思路&#xff1a; 客户端(U…

WinForm 对话框的 Show 与 ShowDialog:阻塞与非阻塞的抉择

目录 核心概念&#xff1a;阻塞与非阻塞 Show 与 ShowDialog 的详细对比 代码示例&#xff1a;两种方式的实现差异 使用 Show () 显示非模态对话框 使用 ShowDialog () 显示模态对话框 适用场景分析 适合使用 Show () 的场景 适合使用 ShowDialog () 的场景 最佳实践与…

晓知识: 动态代理与静态代理的区别

动态代理与静态代理的区别 代理模式是一种常见的设计模式&#xff0c;用于在不修改原始类的情况下扩展其功能。代理分为静态代理和动态代理两种&#xff0c;它们在实现方式、适用场景和灵活性上有显著差异。 静态代理 静态代理在编译时就已经确定代理类和被代理类的关系。代理类…

Linux系统编程Day9 -- gdb (linux)和lldb(macOS)调试工具

往期内容回顾 Git 教程&#xff08;初阶&#xff09; 基于Linux系统知识的第一个程序 自动化构建工具-make/Makefile gcc/g编译及链接 Vim工具的使用 Linux常用工具&#xff08;yum与vim&#xff09; 一、 Linux 下的调试工具 GDB 一、为什么要学习 GDB&#xff1f; 调试是开发…

数据结构(17)排序(下)

一、计数排序计数排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用。操作步骤如下&#xff1a;①统计相同元素出现的次数 ②根据统计的结果将序列回收到原来的序列中比如&#xff0c;现在有一个数组{6,1,2,9,4,2,4,1,4}。该数组中&#xff0c;元素1出现两次&#…

深度解析 Spring Boot 循环依赖:原理、源码与解决方案

在 Spring Boot 开发中,循环依赖是一个常见且容易被忽视的技术点。当两个或多个 Bean 相互引用时,就会形成循环依赖(如 A 依赖 B,B 依赖 A)。初学者往往会困惑:Spring 为什么能自动处理这种看似矛盾的依赖关系?本文将从原理、源码实现到解决方案,全方位剖析 Spring Boo…

数据库的基本操作(约束与DQL查询)

一、约束约束是在表上强制执行的数据规则&#xff0c;用于确保数据的完整性和一致性&#xff08;1&#xff09;约束类型MySQL中支持多种约束类型&#xff1a;①主键约束&#xff08;PRIMARY KEY&#xff09; ②自增约束&#xff08;AUTO_INCREMENT&#xff09;③非空约束…

HP Pavilion G6 笔记本安装Ubuntu开机后自动进入飞行模式的问题解决

问题一台HP Pavilion G6 笔记本 &#xff0c;安装了Ubuntu24.04版本&#xff0c;开机后&#xff0c;直接进入飞行模式&#xff0c;导致无法使用Wifi,且使用fnf10的组合键&#xff0c;也无法关闭飞行模式。使用fnf10键&#xff0c;可以看到提示显示飞行模式&#xff0c;但无法关…

LLM:MoE原理与实现探索

文章目录前言一、Deepseek Moe二. Moe架构1. Expert2. Gate3. MoE Module三、Auxiliary Loss总结前言 MoE&#xff08;Mixture of Experts) 已经逐渐在LLM中广泛应用&#xff0c;其工程部署相关目前也有了越来越多的支持&#xff0c;本文主要记录一下MoE的基本模块构造与原理。…