C语言switch case语句详解(非常详细)

在C语言中,switch case 语句是一种多分支选择结构,用于根据变量的值执行不同的代码块。

相比于if else语句,switch case在处理多个固定值的条件判断时更加简洁和高效。本文将详细讲解switch case语句的用法、语法格式、实例代码、注意事项,以及与if else语句的区别。

1. switch case 语句的基本用法

switch case语句通过匹配一个变量的值,选择执行对应的代码块。它的核心思想是“值匹配”,即根据变量的值跳转到相应的case分支。

语法格式:

switch (表达式) {
    case 常量1:
        // 当表达式的值等于常量1时执行的代码
        break;
    case 常量2:
        // 当表达式的值等于常量2时执行的代码
        break;
    ...
    default:
        // 当表达式的值不匹配任何case时执行的代码
}

代码执行流程:

  1. 计算switch后面表达式的值。

  2. 将表达式的值与每个case后的常量进行比较。

  3. 如果找到匹配的case,则执行对应的代码块,直到遇到break语句或switch语句结束。

  4. 如果没有匹配的case,则执行default块中的代码(如果有)。

2. 实例代码

以下是一个简单的switch case示例,根据用户输入的数字输出对应的星期几:

#include <stdio.h>

int main() {
    int day;

    printf("请输入一个数字(1-7):");
    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;
        default:
            printf("输入错误,请输入1-7之间的数字!\n");
    }

    return 0;
}

代码解释:

  • day是用户输入的数字,switch会根据day的值跳转到对应的case分支。

  • 如果day的值为1,输出"星期一",然后遇到break语句,跳出switch

  • 如果day的值不在1-7之间,执行default块中的代码,提示输入错误。

3. switch case 语句的注意事项

(1)break语句的作用

  • break语句用于结束当前case的执行,跳出switch语句。

  • 如果没有break,程序会继续执行后续的case代码块,直到遇到breakswitch结束。这种现象称为“case穿透”。

示例:
#include <stdio.h>

int main() {
    int num = 2;

    switch (num) {
        case 1:
            printf("执行case 1\n");
        case 2:
            printf("执行case 2\n");  // 因为没有break,继续执行下一个case
        case 3:
            printf("执行case 3\n");
        default:
            printf("执行default\n");
    }

    return 0;
}

输出:

执行case 2
执行case 3
执行default

(2)default块的作用

  • default块是可选的,用于处理所有case都不匹配的情况。

  • 如果没有default,且所有case都不匹配,则switch语句不执行任何代码。

(3)case后的常量必须是整型或字符型

  • switch的表达式和case后的常量必须是整型(如int)或字符型(如char),不能是浮点型或字符串。

(4)case常量不能重复

  • 每个case后的常量值必须唯一,不能有重复。

4. switch case 与if else的区别

(1)适用场景

  • switch case:适用于对固定值的条件判断,尤其是当变量的值有多个明确的选项时(如菜单选择、状态码等)。

  • if else:适用于对范围或复杂条件的判断(如x > 10 && y < 20)。

(2)代码结构

  • switch case:结构清晰,适合多分支选择。

  • if else:结构灵活,适合处理复杂的逻辑。

(3)性能

  • switch case:在某些编译器中,switch case会被优化为跳转表,执行效率较高。

  • if else:需要依次判断每个条件,效率较低。

示例对比:

// 使用 if else
if (day == 1) {
    printf("星期一\n");
} else if (day == 2) {
    printf("星期二\n");
} else if (day == 3) {
    printf("星期三\n");
} else {
    printf("输入错误\n");
}

// 使用 switch case
switch (day) {
    case 1:
        printf("星期一\n");
        break;
    case 2:
        printf("星期二\n");
        break;
    case 3:
        printf("星期三\n");
        break;
    default:
        printf("输入错误\n");
}

5. 总结

  • switch case语句是一种高效的多分支选择结构,适用于对固定值的条件判断。

  • break语句用于防止“case穿透”,确保只执行匹配的case代码块。

  • default用于处理未匹配的情况,是可选的。

  • if else的区别switch case适合处理固定值的多分支选择,而if else适合处理范围或复杂条件。

在实际编程中,应根据具体需求选择合适的条件控制语句。如果条件判断是基于固定值的,优先使用switch case;如果条件判断涉及范围或复杂逻辑,则使用if else。掌握这两种语句的使用场景和技巧,能够帮助你编写更加高效和清晰的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/965465.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek本地部署

前言 蛇年过年前&#xff0c;国产大模型 DeepSeek以更高的效率、更低的计算成本火爆国内外&#xff0c;成为现象级AI&#xff0c;但由于访问人数过多经常频繁出现反应迟缓甚至是宕机的情况。 但万幸的是&#xff0c;DeepSeek 是一个开源模型&#xff0c;我们可以通过本地部署…

springboot简单应用

快速开发Springboot项目实现简单的增删改查&#xff0c;前期需要准备&#xff1a;idea与postman安装 Maven&#xff0c;MySQL&#xff08;8&#xff09;&#xff0c;JDK(21) 目录 前言 springboot 使用3.0版本&#xff0c;JDK使用21,MySQL使用8版本 开发环境IDEA使用2024版本 …

tomcat核心组件及原理概述

目录 1. tomcat概述 1.1 概念 1.2 官网地址 2. 基本使用 2.1下载 3. 整体架构 3.1 核心组件 3.2 从web.xml配置和模块对应角度 3.3 如何处理请求 4. 配置JVM参数 5. 附录 1. tomcat概述 1.1 概念 什么是tomcat Tomcat是一个开源、免费、轻量级的Web服务器。 Tomca…

【Linux】24.进程间通信(3)

文章目录 3.6 systemv共享内存3.6.1 共享内存函数3.6.3 一个简单的共享内存代码实现3.6.4 一个复杂的共享内存代码实现3.6.4 key和shmid的主要区别: 3.7 systemv消息队列&#xff08;了解&#xff09;3.8 systemv信号量&#xff08;了解&#xff09;进程互斥四个问题理解信号量…

115,【7】 攻防世界 web fileinclude

进入靶场 试着访问了几个文件&#xff0c;都没得到信息&#xff0c;f12看看源码 还真有 <?php // 检查是否开启了错误显示功能 // ini_get 函数用于获取 PHP 配置选项的值&#xff0c;这里检查 display_errors 选项是否开启 if( !ini_get(display_errors) ) {// 如果错误…

深入理解Java引用传递

先看一段代码&#xff1a; public static void add(String a) {a "new";System.out.println("add: " a); // 输出内容&#xff1a;add: new}public static void main(String[] args) {String a null;add(a);System.out.println("main: " a);…

langchain教程-7.Embedding/文本向量化

前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…

Mac下使用brew安装go 以及遇到的问题

首先按照网上找到的命令进行安装 brew install go 打开终端输入go version&#xff0c;查看安装的go版本 go version 配置环境变量 查看go的环境变量配置&#xff1a; go env 事实上安装好后的go已经可以使用了。 在home/go下新建src/hello目录&#xff0c;在该目录中新建…

Ubuntu部署Deepseek-R1模型(8b)

安装ubuntu系统 本机电脑系统ubuntu-20.04 #升级软件 sudo apt-get update#安装curl sudo apt-get install curl通过以上两条指令&#xff0c;完成了curl命令的安装。 安装ollama 打开Ollama官网 选择Linux&#xff0c; 给出如上图方框所示的一条指令 curl -fsSL https:…

【ROS视频推流】使用web_video_server完成视频推流

&#x1f680; 本文简要介绍一下使用web_video_server功能包完成实时视频推流的方法。 假设有A,B两个设备&#xff0c;它们之间可以ping通。我们需要将A设备上的实时摄像头图像推流并在B设备的浏览器上显示。 &#x1f314;01准备工作 # A设备 # 下载视频推流功能包 #&#xff…

[LVGL] 在VC_MFC中移植LVGL

前言&#xff1a; 0. 在MFC中开发LVGL的优点是可以用多个Window界面做辅助扩展 1.本文基于VC2022-MFC单文档框架移植lvgl8 2. gitee上下载lvgl8.3 源码&#xff0c;并将其文件夹改名为lvgl lvgl: LVGL 是一个开源图形库&#xff0c;提供您创建具有易于使用的图形元素、漂亮…

Java----线程池

什么是线程池呢&#xff0c;先举一个情景&#xff1a; 一个火锅店开业了&#xff0c;早上人比较少&#xff0c;大家进店后不需要预约&#xff0c;直接付款在店里的桌子上吃饭&#xff0c;慢慢的人多了&#xff0c;店里的桌子不够用了&#xff0c;没座位的人可以先预约&#xf…

安卓开发,底部导航栏

1、创建导航栏图标 使用系统自带的矢量图库文件&#xff0c;鼠标右键点击res->New->Vector Asset 修改 Name , Clip art 和 Color 再创建一个 同样的方法再创建四个按钮 2、添加百分比布局依赖 app\build.gradle.kts 中添加百分比布局依赖&#xff0c;并点击Sync Now …

每日Attention学习22——Inverted Residual RWKV

模块出处 [arXiv 25] [link] [code] RWKV-UNet: Improving UNet with Long-Range Cooperation for Effective Medical Image Segmentation 模块名称 Inverted Residual RWKV (IR-RWKV) 模块作用 用于vision的RWKV结构 模块结构 模块代码 注&#xff1a;cpp扩展请参考作者原…

Git--使用教程

Git的框架讲解 Git 是一个分布式版本控制系统&#xff0c;其架构设计旨在高效地管理代码版本&#xff0c;支持分布式协作&#xff0c;并确保数据的完整性和安全性。 Git 的核心组件&#xff1a; 工作区&#xff08;Working Directory&#xff09;&#xff1a; 工作区是你在本…

智慧停车系统:不同规模停车场的应用差异与YunCitys解决方案

在智慧停车领域&#xff0c;不同规模停车场因自身特点&#xff0c;对智慧停车系统的需求和应用效果存在显著差异。云创智城凭借丰富的经验和先进的技术&#xff0c;为各类规模停车场打造了贴合需求的智慧停车系统&#xff0c;下面为您详细剖析。 小型停车场&#xff1a;精准高…

snort的学习记录

一、what is snort&#xff1f;什么是snort? Snort 是一款开源的 网络入侵检测系统&#xff08;NIDS&#xff09; 和 网络入侵防御系统&#xff08;NIPS&#xff09;&#xff0c;能够实时监控网络流量&#xff0c;检测恶意行为&#xff08;如端口扫描、SQL注入、DDoS攻击等&a…

PHP-trim

[题目信息]&#xff1a; 题目名称题目难度PHP-trim1 [题目考点]&#xff1a; trim() 函数移除字符串两侧的空白字符或其他预定义字符。[Flag格式]: SangFor{dl9hFiITmhQNAJysCgigAskyCZ6kQaDc}[环境部署]&#xff1a; docker-compose.yml文件或者docker tar原始文件。 ht…

maven如何不把依赖的jar打包到同一个jar?

spring boot项目打jar包部署&#xff1a; 经过以下步骤&#xff0c; 最终会形成maven依赖的多个jar&#xff08;包括lib下添加的&#xff09;、 我们编写的程序代码打成一个jar&#xff0c;将程序jar与 依赖jar分开&#xff0c;便于管理&#xff1a; success&#xff1a; 最终…

【ArcGIS Pro 简介1】

ArcGIS Pro 是由 Esri &#xff08;Environmental Systems Research Institute&#xff09;公司开发的下一代桌面地理信息系统&#xff08;GIS&#xff09;软件&#xff0c;是传统 ArcMap 的现代化替代产品。它结合了强大的空间分析能力、直观的用户界面和先进的三维可视化技术…