learn_C_deep_7 (switch 语句的基本理解、case 的作用、break的作用switch、case 推荐规则)

news2025/1/23 13:12:09

目录

switch 语句的基本理解

case语句的深度理解

case 的作用

case语句的要求

break 的作用

switch case 推荐规则

规则一:

规则二:

小结:


switch 语句的基本理解

        switch是一种控制语句,用于控制程序流程的走向。在 switch 语句中,可以根据表达式的值执行特定的代码块。switch 语句包含一个表达式和多个 case 块。首先会计算表达式的值,然后在 case 块中匹配相应的值。如果匹配成功,则执行该 case 块中的代码,然后跳出 switch 语句。如果所有的 case 块均未匹配成功,则执行默认的代码块。

switch (整型变量 / 常量 / 整型表达式) {
case var1:
    break;
case var2:
    break;
case var3:
    break;
default:
    break;
}

接下来我们来看一段代码

//#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#pragma warning(disable:4996)
int main()
{
	int day = 0;
	scanf("%d", &day);
	//if语句具备两个功能
	//1.判断
	//2.分支
	//switch-case-break也具备这个功能
	//但是switc不具备判断和分支的能力,它仅仅做的是拿day的值去进行匹配
	switch (day)
	{
	case 1://1.判断
		printf("星期一!\n");
		break;//2.分支
	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;
}

        这是一个用 C 语言编写的程序。首先,程序使用 `#define` 预处理指令定义了一个宏 `_CRT_SECURE_NO_WARNINGS`,以消除安全问题的警告(scanf)。`#include` 指令包含了 `stdio.h` 头文件,提供了标准输入/输出函数的声明。接着,程序使用 `#pragma` 指令来禁用特定的警告,这里的 `#pragma warning(disable:4996)` 指令是不对 Visual Studio 中的特定警告输出进行编译器检查和编译输出的。

        在 `main` 函数中,程序定义了一个整型变量 `day`,并调用 `scanf` 函数读入一个整数,保存到 `day` 中。程序接着使用 `switch` 语句来根据 `day` 的值输出相应的信息。如果 `day` 的值符合任何一个 `case`,则输出特定的字符串,然后使用 `break` 语句跳出 `switch` 语句的执行。如果 `day` 的值都不符合任何一个 `case`,则不会输出任何信息。最后,`main` 函数返回 0 表示程序正常结束。

        总的来说,该程序演示了使用 `switch` 语句实现多分支选择的功能,优化了使用多个 `if...else` 语句的代码可读性和可维护性。

case语句的深度理解

case 的作用

        在C语言中,`case`是一种用于`switch`语句中的一个关键字。`switch`语句可以根据表达式的值来选择执行哪个`case`分支中的语句块。

case本质本质是进行判定功能。

case语句的要求

switch(m) && case n
//其中m 和 n必须是什么类型变量或者表达式?

//case 语句后的值要求是一个常量表达式或者枚举类型或者宏定义

                        ,即在编译时即可计算出结果的表达式。
//case 语句后面是否可以是const修饰的只读变量呢?不行
#include <stdio.h>
#include <windows.h>
int main()
{
    const int a = 10;
    switch (a) {//可以 - a是常量
    case a: //不行 - error C2051: case 表达式不是常量
        printf("hello\n");
        break;
    default:
        break;
    }
    system("pause");
    return 0;
}

下面这段代码有没有错误呢?

case 1:
        int a = 1;
        print("%d\n",a);
        break;

       

        在 C 语言中,case 语句中不能定义新的变量。这是因为在 C 语言中,switch-case 语句的语法规定,case 分支中只能包含语句,不能包含声明语句。

如果需要在 case 分支中使用变量,我们可以应该在 switch 语句前定义该变量,或者在加上定义时加上{},或者封装成函数

1.

int a = 1;
    switch (day)
    {
    case 1:
        printf("%d\n", a);
        break;

2.

case 1:
	{
		int a = 1;
		printf("%d\n", a);
	}
		break;

3.

void test()
{
	int a = 1;
	printf("%d\n", a);
}
	

    case 1:
		test();
		break;

break 的作用

        在`switch`语句中,`break`用于结束当前分支,跳出整个`switch`语句。

break本质其实是进行分支功能。

如果我们switch语句中没有break会怎么样呢?

        这是一段使用了 switch-case 语句的 C 语言代码,功能是根据输入的数字 day(表示星期几)输出相应的星期几的字符串。 先通过 scanf 函数读入 day 的值,然后使用 switch-case 语句进行判断。在 switch 语句中,针对每个可能的 day 值,都有一个对应的 case 分支,分别输出对应的字符串。 需要注意的是,在 case 分支中没有使用 break 语句,这意味着在匹配到某个 case 分支后,会一直往下执行直到遇到下一个 break 或者 switch 语句结束。因此,如果输入的 day 为 5,输出的不仅是“星期五!”还包括后面的“星期六!”“星期天!”,然后 switch 语句才结束。

总结:每个`case`分支的最后一条语句必须是`break`语句,否则程序将继续执行下一个分支的代码,直到遇到`break`语句或`switch`语句结束为止。

switch case 推荐规则

规则一:

如果我们想周一到周五打印“工作日”,周六到周日打印“休息日”该怎么做呢?

#include<stdio.h>
#pragma warning(disable:4996)
int main()
{
	int day = 0;
	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;
}

上面的这种写法虽然可行,但是重复的语句比较多,此时我们可以换一种写法。

#include<stdio.h>
#pragma warning(disable:4996)
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;
	}
	return 0;
}

总结:如果多个不同case匹配,想执行同一个语句,我们就可以省区前面的case语句,只保留最后一个case语句。

规则二:

        在上面的程序当中,如果我们输入1-7以外的任何数,程序都没有运行结果,那么当用户使用该代码的时候,其代码的体验感是非常不足的,因为你输入1-7以外的任何数,程序没有报错,用户也不清楚要输入什么,以及提示什么错误。所以我们要改进一下上面的代码。

#include<stdio.h>
#pragma warning(disable:4996)
int main()
{
	int day = 0;
	printf("Please enter your 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;
	default:
		printf("你输入的值有误!\n");
	}
	return 0;
}

 总结:default 是一个关键字,用于 switch-case 语句结构中的 "缺省(默认)" 分支。default 分支表示当所有的 case 分支都不匹配时,执行的代码。需要注意的是,default 分支可以放在 switch 语句的任何位置。但通常情况下,建议将 default 分支放到 switch 语句的最后面,以便于更好地理解代码的逻辑。

小结:

1.switch语句中,case完成判断功能,break完成分支功能,default完成处理异常情况。

2.case  表达式:

        语句;

        2.1.如果表达式和语句是一对多的关系(case有多条语句),此时不能再case中定义                    变量,如果需要,使用函数或{}或在switch外定义该变量。

        2.2.如果表达式和语句是多对一的关系,此时建议在执行相同语句的case后省区break                  语句,只需最后一个保留即可。

3.default可以出现在switch内的任何地方,建议放在末尾。

4.case :表达式必须在编译的时候就能转化为值,可以是宏,但是const修饰的变量不可以。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zookeeper系统模型介绍

目录 一、数据模型 二、 节点的类型 &#xff08;1&#xff09;持久节点 &#xff08;2&#xff09;持久顺序节点 &#xff08;3&#xff09;临时节点 &#xff08;4&#xff09;临时顺序节点 三、客户端命令行 &#xff08;1&#xff09;创建节点 &#xff08;2&…

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式 大纲 基础概念证书替换测试使用kubeadm alpha certs renew all 更新证书重启所有组件和kubelet.service生成kubelet-client-current.pem证书测试替换后集群是否正常工作 基础概念 本次测试使用的k8s集群使用…

【代码随想录】刷题Day9 --- 我有自信讲清楚KMP的next原理

字符串 --- 找子串匹配算法_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/130197908?spm1001.2014.3001.5501 首先具体KMP算法理论在上面的博客中&#xff0c;不过该博客我当初写的时候并没有了解next数组实现的过程是那样的&#xff0c;所以只…

【react全家桶学习】react中组件的props属性(详)

学过了vue的props属性&#xff0c;那react中的props属性如何使用呢&#xff1f; props的基本使用 我们先定义一个person组件 我们想要这三个参数动态传递进来&#xff0c;如何实现&#xff1f; 答&#xff1a;跟vue一样&#xff0c;直接在引用组件的地方进行传递即可。 在re…

Java——两个链表的第一个公共节点

题目链接 牛客网在线oj题——两个链表的第一个公共节点 题目描述 输入两个无环的单向链表&#xff0c;找出它们的第一个公共结点&#xff0c;如果没有公共节点则返回空。&#xff08;注意因为传入数据是链表&#xff0c;所以错误测试数据的提示是用其他方式显示的&#xff0…

润本“带伤”冲刺IPO,再闯“驱蚊第一股”

夏日来临&#xff0c;润本再度冲刺“驱蚊第一股”&#xff01; 今年3月&#xff0c;润本生物技术股份有限公司&#xff08;下称“润本”&#xff09;再次更新招股书&#xff0c;拟在上交所主板上市。 润本是一家多品牌家庭护理产品公司&#xff0c; 专注于驱蚊类、个人护理类…

米哈游新游正式公测!还没上线就已经“爆了”!

米哈游制作的3D冒险主题回合制策略游戏《崩坏&#xff1a;星穹铁道》&#xff0c;在2023年4月26日正式开启全平台公测。 该游戏在2021年10月27日曾开启过“始发测试”&#xff0c;后继续沉淀了两年才正式开启公测。 B站的ACG内容生态丰富&#xff0c;其中游戏相关内容当数米哈…

C++“this”指针的使用

1.this指针的引出 先看一段代码&#xff1a; class Date { public:Date(int year0,int month0,int day0){_year year;_month month;_day day;}void Print(){cout << _year << " "<< _month << " "<< _day << end…

无需公网IP 使用SSH远程连接Linux CentOS服务器【内网穿透】

文章目录 视频教程1. Linux CentOS安装cpolar2. 创建TCP隧道3. 随机地址公网远程连接4. 固定TCP地址5. 使用固定公网TCP地址SSH远程 本次教程我们来实现如何在外公网环境下&#xff0c;SSH远程连接家里/公司的Linux CentOS服务器&#xff0c;无需公网IP&#xff0c;也不需要设置…

SDK_examples问题汇总

CompParameter 看起来可以用 拖动中间的dialog框 调整下面的参数 GraphicsViewDropEvent 点击“模型库”或者“用户模型”会弹出如下&#xff0c;点击“中止”后退出页面 MassSpringDamperApp 成功过&#xff0c;现在点击“开始仿真”会显示仿真失败 MwBatchSimPlu…

Coremail RSAC大会观察:在邮件安全领域AI既是矛也是盾

《Coremail RSAC大会观察&#xff1a;在邮件安全领域AI既是矛也是盾》 全球网络安全界的盛会——2023年RSAC大会于当地时间4月24日-27日在美国旧金山召开&#xff0c;大会以“Stronger Together&#xff08;一起变得更强大&#xff09;”为主题&#xff0c;议程主要包含安全研…

想入门网络安全?先来看看网络安全行业人才需求!

如果你是一个想要入门网络安全行业的小白、如果你是网络安全专业在读的大学生、如果你是正在找工作的新手&#xff0c;那么这篇文章你一定要仔细看。毕竟知己知彼百战百胜&#xff0c;知道行业的人才需求才能更好得发挥自己的优势。 当你打开BOSS直聘、拉钩等招聘网站&#xf…

【CTF WriteUp】2023数字中国创新大赛网络数据安全赛道决赛WP(1)

2023数字中国创新大赛网络数据安全赛道决赛WP(1) 比赛感想 不多说了&#xff0c;还是菜&#xff0c;各种不会&#xff0c;还得学 数据安全题目 Crypto-ddddmm import os from Crypto.Util.number import * from secret import flagdef genkey(bits):p getPrime(bits)q g…

网络模型与 IO 多路复用

一、基础概念1. socket2. FD&#xff1a;file descriptor**3. 内核态和用户态 二、 IO 多路复用1. 常见的IO模型2. 同步和异步3. 阻塞和非阻塞 三、 阻塞IO四、非阻塞 IO1、针对 read 函数造成的阻塞2、针对 accept函数造成的阻塞3、 select 模型4、poll模型5、epoll模型 一、基…

点成分享丨液滴生成解决方案

电源及电线为了满足用户的液滴生成需求&#xff0c;点成生物联合cellix推出了点成生物液滴生成解决方案&#xff0c;该套装可以一站式轻松满足用户液滴生成实验的需求。 Part.01 点成小科普 液滴生成&#xff0c;是一种在具备某种几何形状的微流控芯片中使用微流控泵精确控制…

Drools 规则引擎(包括动态加载数据库中规则引擎)

Drools 规则引擎 文章目录 Drools 规则引擎前言一、规则引擎是什么&#xff1f;二、Drools 简介1.引入规则引擎前后程序架构&#xff1a;2.Drools API 开发步骤&#xff1a;在这里插入图片描述 三、Drools 快速入门1.使用项目文件作为规则引擎2.使用数据库存储规则引擎 四、Dro…

【shell脚本】条件语句

一、条件测试操作 1.1test命令与 [ ] 符号 测试表达试是否成立&#xff0c;若成立返回0&#xff0c;否则返回其它数值 1.1.1文件测试常用的测试操作符 符号作用-d测试是否为目录-e测试是否为目录或文件-f测试是否为文件-r测试当前用户是否有读取权限-w测试当前用户是否有写…

2023-4-27-深入理解C++指针类型间强制转换

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

【致敬未来的攻城狮计划】— 连续打卡第十四天:FSP固件库开发延时函数(时钟详解)

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

数据结构_线性表、顺序表、单链表

目录 1. 线性表的定义和基本操作 1.1 线性表的定义 1.2 线性表的特点 1.3 线性表的基本操作 2. 线性表的顺序表示 2.1 顺序表的定义 2.2 顺序表上基本操作的实现 2.2.1 插入操作 2.2.2 删除操作 2.2.3 按值查找 2.3 相关练习巩固 3. 线性表的链式表示 3.1 单链表的…