【C语言】分支与循环(分支篇)

news2024/9/21 23:41:12

前言

C语言是一种结构化的计算机语言,这里指的通常是顺序结构、选择结构、循环结构,掌握这三种结构之后我们就可以解决大多数问题。

分支结构可以使用ifswitch来实现,而循环可以使用forwhiledo while来实现。

1. if语句

1.1 if

if语句的语法如下:

if(表达式)
    语句

在这里插入图片描述

表达式为真,语句执行,表达式为假,则语句不执行。
在C语言中,0为假,非0表示真,也就是表达式的结果如果为0,则语句不执行,如果不是0,则执行。
比如:输入一个整数判断是否为偶数

int main()
{
	int i = 0;
	
	if(i % 2 == 0)
		printf("%d是偶数", i);

	return 0;
}

1.2 else

如果一个数不是偶数,那么就是奇数,这就需要if...else...语句:

if(表达式)
    语句1
else
	语句2

比如:输入一个整数,判断是偶数还是奇数

int main()
{
	int i = 0;
	scanf("%d", &i);
	
	if(i % 2 == 0)
		printf("%d是偶数", i);
	else
		printf("%d是奇数", i);

	return 0;
}

在上面的代码中,if语句只控制了一条语句,就是printf("%d是偶数", i);,如果控制两条语句的话,就需要使用{}将代码括起来,else也可以,如下:

int main()
{
	int i = 0;
	scanf("%d", &i);
	
	if(i % 2 == 0)
	{
		printf("%d是偶数", i);
		printf("下一个数是奇数");
	}
	else
	{
		printf("%d是奇数", i);
		printf("下一个数是偶数");
	}

	return 0;
}

1.3 嵌套if

if else中,else可以与另一个if语句连用,构成多重判断,比如:
判断输入一个整数,判断是负数、正数或是0:

int main()
{
	int i = 0;
	scanf("%d", &i);
	if(i == 0)
		printf("输入的数字为0\n");
	else if(i > 0)
		printf("输入的数字为正数\n");
	else
		printf("输入的数字为负数\n");

	return 0;
}

再比如:
判断输入一个整数,判断是负数、正数或是0,如果是正数判断是奇数还是偶数:

int main()
{
	int i = 0;
	scanf("%d", &i);
	if(i == 0)
		printf("输入的数字为0\n");
	else if(i > 0)
	{
		if(i % 2 == 0)
			printf("%d是偶数", i);
		else
			printf("%d是奇数", i);
	}
	else
		printf("输入的数字为负数\n");

	return 0;
}

1.4 悬空else

如果有多个 ifelse,那么else总是和最接近的if匹配。
比如:

int main()
{
	int a = 0;
	int b = 2;
	
	if (a == 1)
		if (b == 2)
			printf("hello\n");
	else
		printf("world\n");

	return 0;
}

当我们运行这段代码可以发现什么都没有输出:
在这里插入图片描述
这是因为else总是与最近的if匹配,上面代码中会让初学者以为else是与第一个if匹配的,当第一个if语句不成立以为自然会执行else语句打印“world”,但实际上else是与第二个if语句匹配,嵌套在第一个if语句中,所以最终什么都不打印。

如果我们想让else与第一个if语句匹配可以这样修改:

int main()
{
	int a = 0;
	int b = 2;
	
	if (a == 1)
	{
		if (b == 2)
			printf("hello\n");
	}
	else
	{
		printf("world\n");
	}

	return 0;
}

这样就执行了else语句:
在这里插入图片描述

或者这样改,就执行了第一条if语句:

int main()
{
	int a = 1;
	int b = 2;
	
	if (a == 1)
	{
		if (b == 2)
		{
			printf("hello\n");
		}
		else
		{
			printf("world\n");
		}
	}
	
	return 0;
}

在这里插入图片描述

2. switch语句

除了if语句,还有一种switch语句可以实现分支结构。
这种语句用于判断条件有多个结果的情况,把多重的if...else...语句改成可读性更好的形式。

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

这段代码中,根据表达式expression的值,执行相应的case分支,如果没有对应的值,则执行default分支。

注意:

  • expression必须是整型表达式
  • case后的值必须是整型常量表达式

2.1 if语句和switch语句的对比

比如输入一个数,计算除3之后的余数:
使用if语句完成:

int main()
{
	int num = 0;
	scanf("%d", &num);

	if (num % 3 == 0)
	{
		printf("整除\n");
	}
	else if (num % 3 == 1)
	{
		printf("余数是1\n");
	}
	else
	{
		printf("余数是2\n");
	}

	return 0;
}

使用switch语句写:

int main()
{
	int num = 0;
	scanf("%d", &num);

	switch (num % 3)
	{
	case 0:
		printf("整除\n");
		break;
	case 1:
		printf("余数是1\n");
		break;
	case 2:
		printf("余数是2\n");
		break;
	}
	
	return 0;
}

这里要注意:

  • case和后面的数字之间要有空格,否则会有语法错误
  • 每一个case语句执行后,需要加上break,才能跳出这个语句。

2.2 switch语句中的break

上面的代码中,如果去掉case语句中的break,那么会出现什么情况:

int main()
{
	int num = 0;
	scanf("%d", &num);

	switch (num % 3)
	{
	case 0:
		printf("整除\n");
	case 1:
		printf("余数是1\n");
	case 2:
		printf("余数是2\n");
	}
	
	return 0;
}

在这里插入图片描述
这时可以发现,10除以3本来余数为1,但程序多出了一行 “余数是2” 的打印。

原因就是在case语句后只有加上break才能跳出switch语句,如果才某一条case语句后没有break,那么代码就会继续执行,直到遇到break或者整个switch语句结束。

所以想在某一条case语句中跳出switch语句,要记得在后面加上break。

2.3 switch语句中的default

在使用switch语句的时候,会经常遇到一种情况,比如没有任何一条case语句能匹配表达式中的值,这时如果需要处理,那么就需要在switch语句中加入default语句。

比如我们写一段代码,输入一个数来判断今天是工作日还是休息日:

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~7以外的数字的时候就会提示 “输入错误”。

2.4 switch语句中的顺序问题

在switch语句中,对于case和default子句没有顺序要求,不过通常会将default语句放在最后处理。

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

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

相关文章

【滴水三期】32/64位——PE文件节表打印与解析

【作业内容】 1、手动查&#xff0c;画个PE文件图。 2、编写程序打印节表中的信息。 3、根据节表中的信息&#xff0c;到文件中找到所有的节&#xff0c;观察节的开始位置与大小是否与节表中的描述一致 【PE file_buffer文件图】 【IMAGE_SECTION_HEADER解析】 <winNT.h…

web浏览器播放rtsp视频流,海康监控API

概述 这里记录一下如何让前端播放rtsp协议的视频流 ​ 项目中调用海康API&#xff0c;生成的视频流(hls、ws、rtmp等)通过PotPlayer播放器都无法播放&#xff0c;说明视频流有问题&#xff0c;唯独rtsp视频流可以播放。 但是浏览器本身是无法播放rtsp视频的&#xff0c;即使…

Qt3D给圆环等立体图形添加纹理图片

添加纹理图片&#xff0c;首先需要自己找一个纹理图&#xff0c;当然了&#xff0c;随便什么图片都行。 创建3D图形的主要步骤查看另一篇文章。 这里主要代码如下&#xff1a; 使用QTextureLoader加载图片&#xff0c;图片路径需为qrc:/的路径。 auto *planeTransform1 ne…

PyMongo

什么是PyMongo PyMongo 是一个 Python 库&#xff0c;用于与 MongoDB 数据库进行交互。MongoDB 是一个基于文档的 NoSQL 数据库&#xff0c;提供高性能、可扩展性和灵活的架构。PyMongo 提供了一套工具&#xff0c;使得在 Python 程序中操作 MongoDB 变得简单和高效。 安装PyMo…

【C++程序设计】——利用数组处理批量数据(二)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-削好皮的Pineapple! &#x1f468;‍&#x1f4bb; hello 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 削好皮的Pineapple! 原创 &#x1f468;‍&#x1f4…

17085 工作分配问题(优先做)

这个问题可以通过回溯法来解决。我们可以遍历所有可能的工作分配方案&#xff0c;然后找出总劳务费用最小的方案。 以下是C代码实现&#xff1a; #include <iostream> #include <vector> #include <algorithm> using namespace std;const int INF 1e9; co…

羌活基因组--文献精读-36

The chromosome-scale assembly of the Notopterygium incisum genome provides insight into the structural diversity of coumarins 羌活&#xff08;Notopterygium incisum&#xff09;基因组的染色体级别组装为香豆素的结构多样性提供了新的见解 摘要 香豆素是由苯丙素途…

内网安全:多种横向移动方式

1.MMC20.Application远程执行命令 2.ShellWindows远程执行命令 3.ShellBrowserWindow远程执行命令 4.WinRM远程执行命令横向移动 5.使用系统漏洞ms17010横向移动 DCOM&#xff1a; DCOM&#xff08;分布式组件对象模型&#xff09;是微软的一系列概念和程序接口。它支持不同…

Java中操作文件

认识⽂件 我们先来认识狭义上的⽂件(file)。针对硬盘这种持久化存储的I/O设备&#xff0c;当我们想要进⾏数据保存时&#xff0c; 往往不是保存成⼀个整体&#xff0c;⽽是独⽴成⼀个个的单位进⾏保存&#xff0c;这个独⽴的单位就被抽象成⽂件的概 念&#xff0c;就类似办公桌…

【Linux】深入理解线程

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

基于ssm的图书管理系统/图书借阅管理系统

获取源码联系方式请查看文章结尾&#x1f345; 摘 要 网络技术的快速发展给各行各业带来了很大的突破&#xff0c;也给各行各业提供了一种新的管理模块&#xff0c;对于图书管理将是又一个传统管理到智能化信息管理的改革&#xff0c;对于传统的图书借阅的管理&#xff0c;所包…

最长上升子序列LIS(一般+优化)

1. 题目 题目链接&#xff1a; B3637 最长上升子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 输入样例&#xff1a; 6 1 2 4 1 3 4 输出样例&#xff1a; 4 说明/提示&#xff1a; 分别取出 1、2、3、4 即可。 2. 具体实现 2.1 一般做法 dp[i]表示第i个位置的…

医院管理系统读取身份证源码- CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构

一、身份证读取 提高效率&#xff1a;快速获取身份信息&#xff0c;避免手动输入的繁琐和耗时&#xff0c;极大地提升业务办理速度。 准确性高&#xff1a;减少人工输入错误&#xff0c;确保身份信息的精准无误。 便捷操作&#xff1a;简化流程&#xff0c;使工作人员操作更轻…

51单片机个人学习笔记14(直流电机驱动及PWM)

前言 本篇文章属于STC89C52单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 [1-1] 课程简介_哔哩…

Elemnt UI筛选时间功能

html&#xff1a; <el-form-item label"数据筛选: " ><el-date-picker v-model"choose_time" type"datetimerange" size"small" change"chooseTime" style"width:100%;" value-format"yyyy-MM-dd …

逻辑推理之lora微调

逻辑推理微调 比赛介绍准备内容lora微调lora微调介绍lora优势代码内容 start_vllm相关介绍调用 运行主函数提交结果总结相应连接 比赛介绍 本比赛旨在测试参与者的逻辑推理和问题解决能力。参与者将面对一系列复杂的逻辑谜题&#xff0c;涵盖多个领域的推理挑战。 比赛的连接:…

内网穿透--ICMP隧道转发实验

实验背景 通过公司带有防火墙功能的路由器接入互联网&#xff0c;然后由于私网IP的缘故&#xff0c;公网无法直接访问内部web服务器主机。通过内网其它主机做代理&#xff0c;穿透访问内网web服务器主机边界路由器或防火墙做静态NAT映射访问内网服务器inux主机&#xff0c;且策…

C++分析AVL树

目录 AVL树介绍 AVL树平衡因子更新分析 AVL树插入时旋转与平衡因子更新 左单旋 右单旋 左右单旋 右左单旋 AVL旋转可行性 AVL树节点删除&#xff08;待补充&#xff09; AVL树分析 AVL树介绍 二叉搜索树在某些极端情况下可能会退化&#xff0c;为了解决这个问题&…

Redis学习[6] ——Redis缓存设计

八、Redis缓存设计 8.1 为什么Redis用作缓存&#xff1f; 一般来说&#xff0c;数据库的数据都是落在磁盘上的&#xff0c;会导致读写速度很慢。如果用户的请求量非常大&#xff0c;数据库很容易崩溃。由于Redis的数据保存在内存中&#xff0c;读写速度很快&#xff0c;所以R…

SQL注入 报错注入+附加拓展知识,一篇文章带你轻松入门

第5关--------------------------------------------> 前端直接不会显示账号密码的打印&#xff1b;但是在接收前端的数据的那部分后端那里&#xff0c;会看前端传递过来的值是否正确&#xff0c;如果不正确&#xff0c;后端接收值那里就会当MySQL语句执行错误&#xff0c;…