首页 > 其他分享 >switch多分支语句及其相关概念详解

switch多分支语句及其相关概念详解

时间:2024-10-30 10:46:25浏览次数:3  
标签:语句 case default break switch 详解 表达式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

在实际生活中,我们常常要面对多种多样的选择,如果要用编程来解决这些问题,我们就可以用选择语句来解决问题。

通常我们遇到这类问题都可能习惯去使用if语句来解决,但是如果选择太多使用if语句就会相当繁琐。而在这个时候,我们就需要一个能够将代码简化的语句,那就是 ---- switch语句


一、switch语句及其相关概念详解

1.C语言中的switch语句


在C语言中,switch语句是一种多分支选择结构,它允许根据表达式的值来执行不同的代码块。switch语句的基本语法如下:

switch (表达式) {
    case 常量1:
        语句1;
        break;
    case 常量2:
        语句2;
        break;
    // 可以有多个case分支
    default:
        语句n;
    //当表达式结果都不与case匹配时执行default语句
}

在switch语句中,表达式通常是一个变量或常量,而case后的常量是一系列可能的值,程序会根据表达式的值选择执行与之匹配的case块中的代码。如果表达式的值与任何case后的常量表达式相匹配,程序就会执行那一行代码之后的所有代码,直到遇到break语句为止。break语句用于退出switch语句,避免执行后续的case块中的代码。default分支是可选的,它会在没有任何case与表达式匹配时执行。


2.使用switch语句注意事项


  ①switch语句中的表达式必须是整数类型或可以隐式转换为整数类型的表达式。
  ②case标签中的常量值必须是唯一的,不能有重复的值。
  ③default标签是可选的,如果存在,它必须位于switch语句的末尾,但不强制要求一定要有default分支。
  ④case标签中只能使用常量值,不能使用变量或表达式。
  ⑤case标签的顺序不影响程序的执行,程序会按case标签出现的顺序进行匹配.
switch语句在处理具有多个离散值的变量时非常有用,它可以提高代码的可读性和效率,尤其是在处理菜单选项、状态机或者任何需要根据单一变量的值执行多种操作的场合。

3.case在switch语句中的基本概念


在C语言的switch语句里,case是一个关键的组成部分。它用于定义一个可能与switch表达式相匹配的值。
  ①语法形式
      基本语法为case 常量表达式:,这个常量表达式在编译时就能够确定其值。例如,case 1:、case 'a':等都是合法的case表达式。
  ②匹配机制
      当switch语句中的表达式的值与某个case后的常量表达式的值相等时,程序就会从这个case后面的语句开始执行,直到遇到break语句或者switch语句结束。如果num的值为1,那么就会执行case 1后面的printf语句,然后遇到break就跳出switch语句。


4.case的注意事项


  ①常量要求
      case后面必须跟常量表达式,不能是变量或者包含变量的表达式。例如,int x = 1; case x:是非法的。
  ②值的唯一性
      在同一个switch语句中,各个case后面的常量表达式的值必须是不同的。如果出现相同的值,会导致编译错误或者逻辑混乱。
  ③执行顺序
      虽然case的排列顺序不影响switch语句的匹配功能,但按照逻辑顺序排列case可以提高代码的可读性。例如,按照数值从小到大或者按照某种逻辑顺序排列case常量表达式的值。
  ④无默认执行顺序
      在没有break语句的情况下,一旦某个case被匹配,程序会顺序执行后面的case语句,而不会自动跳转到下一个不同的case。这一点在编写switch语句时需要特别注意,以避免出现意外的执行结果。

5.break在switch语句中的基本概念


在C语言中,break语句用于立即终止当前正在执行的循环或switch语句,并使程序流向其后的第一条语句。break的主要作用包括:
  ①跳出循环:在for、while或do-while循环中,当break被执行时,循环会立即停止,程序不会执行循环体内的剩余语句,也不会进入下一次迭代。
  ②跳出switch语句:在switch语句中,每个case标签后面通常都会跟随一个break语句。当执行到break时,程序会跳出switch语句,不会继续执行后续case中的代码。


6.break语句的典型使用示例


以下是break语句在循环和switch语句中的使用示例:

①循环中的break

//循环中的break
#include <stdio.h>

int main() {
    for (int i = 0; i < 10; i++) {
        if (i == 5) {
            break; // 当 i 等于 5 时跳出循环
        }
        printf("%d ", i);
    }
    return 0;
}

在这个例子中,当i达到5时,break语句会执行,循环终止,输出结果为0 1 2 3 4。

②switch语句中的break

//switch语句中的break
#include <stdio.h>

int main() {
    int choice = 3;

    switch (choice) {
        case 1:
            printf("Option 1 selected\n");
            break;
        case 2:
            printf("Option 2 selected\n");
            break;
        case 3:
            printf("Option 3 selected\n");
            // 如果这里没有break,程序将继续执行case 4中的代码
            break;
        case 4:
            printf("Option 4 selected\n");
            break;
        default:
            printf("No valid options\n");
    }
    return 0;
}

在这个switch语句的例子中,每个case标签后面都有一个break,以防止程序继续执行后续case中的代码。如果缺少了break,程序将不会在匹配到一个case后立即跳出switch语句,而是会继续执行直到遇到下一个break或switch语句结束。
③break语句的最佳实践
  1.避免滥用:过度使用break可能会使代码结构复杂化,难以阅读和维护。
  2.检查位置:确保break语句放置在正确的位置,以避免意外的逻辑错误或无限循环。
  3.结合条件使用:在循环中,break通常与条件语句结合使用,以基于特定条件提前退出循环。
通过合理使用break语句,可以提高C语言程序的效率和可读性.

7.default在switch语句中的基本概念


在C语言中,default关键字用于switch语句中,作为一个备选的分支。它的作用是在switch语句中,当所有的case标签都不与控制表达式的值相匹配时,执行default标签后面的代码块。这意味着default是一个“兜底”选项,保证了即使没有任何case条件被满足,程序也有相应的执行路径。

①使用规则
  1.default标签不是必须的,它的存在与否取决于程序员是否需要在所有case条件都不匹配时执行某些代码。
  2.default标签可以在任何位置出现在switch语句中,不仅仅是在最后。如果default不在最后,即使执行了default后面的代码,程序仍然会继续执行紧随其后的case标签中的代码,除非遇到了break语句。
  3.如果default后面跟着其他的case标签,那么在执行default代码块后,程序会继续执行这些case标签中的代码,除非遇到了break语句。这是因为switch语句会一直执行直到遇到break语句为止,而default本身并不具有中断执行流程的作用。
  4.通常建议将default标签放在switch语句的最后,以增加代码的清晰性和可维护性。


8.default语句的典型使用示例

#include <stdio.h>

int main() {
    int num = 5;
    switch (num) {
        case 1:
            printf("Number is 1\n");
            break;
        case 2:
            printf("Number is 2\n");
            break;
        case 3:
            printf("Number is 3\n");
            break;
        default:
            printf("Number is not between 1 and 3\n");
            // 此处不加break,如果default后面有case标签,程序将继续执行
    }
    return 0;
}

在这个示例中,如果num的值为5,则会执行default标签后的代码,因为没有任何case的值与5匹配。如果default后面没有紧跟其他case标签,则执行完毕后会退出switch语句。如果有其他case标签,则需要额外的break语句来确保流程的正确终止。

二、switch语句灵活运用及代码分析

  #include <stdio.h>
  int main() {
  	int x = 3;
  	int y = 3;
  	switch (x % 2) {  // x%2的结果为1,因此执行case1
  	case 1:
  		switch (y)   // y是3,因此会执行case3,而case3不存在,那只能执行default
  		{
  		case 0:
  			printf("first");
  		case 1:
  			printf("second");
  			break;
  		default: printf("hello"); // 打印hello,打印完之后,内部switch结束,此时外部case1结束
  		}             // 因为外部case1之后没有添加break语句,所以继续执行case2
  	case 2:             // 打印third
  		printf("third");      // 外部switch结束
  	}
  	return 0;
  }
  

最后输出"hellothird",switch语句时多分支的选择语句,switch中表达式结果命中那个case,就执行该case子项,如果case子项后没有跟break语句,则继续往下执行。

标签:语句,case,default,break,switch,详解,表达式
From: https://blog.csdn.net/qq_74215677/article/details/143317116

相关文章

  • USB协议详解第26讲(USB包-批量传输包详解)
    1.批量传输包结构批量传输由一个或多个批量事务组成,每一个批量事务具有令牌包、数据包、握手包,如图下所示。批量事务类型的特点是能够通过错误检测和重试来保证主机和设备之间数据的无错误传递。需要理解和注意以下点。(1)当主机准备接收批量数据时,它发出IN令牌,设备端点通过返回......
  • 【C语言】预处理(预编译)详解(下)(C语言最终篇)
    文章目录一、#和##1.#运算符2.##运算符二、预处理指令#undef三、条件编译1.单分支条件编译2.多分支条件编译3.判断符号是否被定义4.判断符号是否没有被定义四、头文件的包含1.库头文件的包含2.本地头文件的包含3.嵌套包含头文件的解决方法使用条件编译指令使用预处理......
  • MobileNetv2网络详解
    背景:MobileNetv1中DW卷积在训练完之后部分卷积核会废掉,大部分参数为“0”MobileNetv2网络是由Google团队在2018年提出的,相比于MobileNetv1网络,准确率更高,模型更小网络亮点:InvertedResiduals(倒残差结构)LinearBottlenecks倒残差结构:ResidualBlock:ResNet网络中提出......
  • 帝国CMS中打印模板制作教程详解
    调用打印页面链接:模板中添加打印页面链接:[!--news.url--]e/DoPrint/?classid=[!--classid--]&id=[!--id--]指定使用打印模板的链接:[!--news.url--]e/DoPrint/?classid=[!--classid--]&id=[!--id--]&tempid=打印模板ID管理打印模板:登录后台,选择“模板......
  • 数据结构————map,set详解
    今天带来map和set的详解,保证大家分清楚一,概念map和set是一种专门用来搜索的容器或数据结构map能存储两个数据类型,我们称之为<key-value>模型set只能存储一个数据类型,我们称之为纯<key>模型它们的效率都非常非常高,我们来一个一个了解。二,详解map1,map的说明map是一个接......
  • hosts.allow与hosts.deny详解
    概述在Linux系统中,hosts.allow和hosts.deny都属于TCPWrappers的一部分,用于控制服务的访问权限。不过它们的应用方式有所不同:默认情况下,这两个文件都不会主动限制任何访问。也就是说,如果hosts.allow和hosts.deny文件中都没有任何规则配置,系统会默认允许所有连接......
  • 3D Gaussian Splatting代码详解(一):模型训练、数据加载
    1模型训练deftraining(dataset,opt,pipe,testing_iterations,saving_iterations,checkpoint_iterations,checkpoint,debug_from):first_iter=0#初始化高斯模型,用于表示场景中的每个点的3D高斯分布gaussians=GaussianModel(dataset.sh_degree)......
  • DRAM的工作原理详解
    DRAM(DynamicRandomAccessMemory,动态随机存储器)是一种常用的半导体存储器类型,具有高密度、低成本和快速访问等特点。它用于计算机内存中,以存储数据和指令。了解DRAM的工作原理可以帮助我们理解它如何处理读写数据。DRAM基本结构DRAM是基于电容器和晶体管结构的。每个DRAM存......
  • 模二除法详解
    模二除法(Modulo-2Division)是一种特殊的除法运算,用于计算二进制数据的CRC校验码。这种运算与普通的除法类似,但区别在于它使用不进位的异或运算来代替普通除法中的减法操作。模二除法的结果为二进制余数,应用在校验过程中以检验数据完整性。模二除法的基本规则模二除法的每一......
  • 知识的定义与分类体系详解 - 从零基础到专业理解
    知识的定义与分类体系详解-从零基础到专业理解引言1.什么是知识?2.知识有什么特点?3.知识的分类3.1按照知识层次划分(就像游戏的等级)3.2按照知识的性质划分(就像食谱的不同部分)3.3按照知识来源划分(就像知识的"家族")4.知识的应用有趣的小练习小贴士关键词引言......