C语言:分支语句和循环语句

news2024/12/23 9:22:35

往期文章

  1. C语言:初识C语言

目录

  • 往期文章
  • 前言
  • 1. 什么是语句
  • 2. 分支语句(选择结构)
    • 2.1 if语句
    • 2.2 switch语句
  • 3. 循环语句
    • 3.1 while循环
    • 3.2 for循环
    • 3.3 do while 循环
    • 3.4 goto语句
  • 后记

前言

趁热打铁啊。写完该系列第一篇博客我就来劲了,迫不及待地开始第二篇。我自认为我第一篇文章写地不错,内容详细,配图认真,大家感兴趣可以点击链接上面往期文章支持一下。也欢迎大家批评指正。接下来我们开启第二篇文章,主要来介绍分支语句很循环语句。欢迎大家多多支持。
在这里插入图片描述

在这里插入图片描述

1. 什么是语句

C语言中由一个分号 ; 隔开的就是一条语句。
所以,我们这个专栏的名字是:以分号结尾的诗。
如果只有一个分号是空语句。

printf("nihao");
1+2;
;

2. 分支语句(选择结构)

我们先来回顾一下第一篇文章中的内容:
在这里插入图片描述

这就是需要选择结构的情况。
那么,我们如何实现选择语句呢?我们有if语句和switch语句。

2.1 if语句

在这里插入图片描述
表达式结果为真,则条件成立,反之则代表着条件不成立。
我们来看一个例子:

#include <stdio.h>

int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age<18)
	{
		printf("未成年\n");
	}
	return 0;
}

在这里插入图片描述
大家注意,如果if语句后不加{},那么其后只有一条语句可以被if作用,如果if后要被if作用多条语句,一定要加{}。举一个例子。


#include <stdio.h>

int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age<18)
		printf("未成年\n");
	    printf("不可以抽烟喝酒\n");
	    printf("不可以结婚\n");
	return 0;
}

#include <stdio.h>

int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
	{
		printf("未成年\n");
		printf("不可以抽烟喝酒\n");
		printf("不可以结婚\n");
	}
	return 0;
}

在这里插入图片描述
大家明白{}的作用啦嘛。{}里面才是一个代码块哦。所以为了防止出错,我们建议全部跟上{}。
所以多条语句的正确书写格式为:

#include <stdio.h>
int main()
{
	if (表达式)
	{
		语句列表1;
	}
	else
	{
		语句列表2;
	}
	return 0;
}

if还有一个好搭档——else。else的作用不容小觑,我们一起来看看。

#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age<18)
	{
		printf("未成年\n");
	}
	else
	{
		printf("成年\n");
	}
}

在这里插入图片描述
else后{}的作用同if一样。
但是有些时候,一对if、else难以解决问题,此时,我们就需要多分支语句啦。也就是要用到else if。

#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
	{
		printf("少年\n");
	}
	else if (age >= 18 && age < 30)
	{
		printf("青年\n");
	}
	else if (age >= 30 && age < 50)
	{
		printf("中年\n");
	}
}

在这里插入图片描述

接下来,我们研究一个问题,这段代码会输出什么?

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	   if (b == 2)
		   printf("hehe\n");
	else
		printf("haha\n");
	return 0;
}

是呵呵呢还是哈哈呢?见证一下:
在这里插入图片描述
输出的是空空哦。
惊不惊喜?意不意外?为什么是这样呢?
因为else和其上面最近的if匹配

在这里插入图片描述
我们将格式调整一下就可以看地更明显:
在这里插入图片描述
这也告诉我们,良好的代码风格很重要,会给人清晰明了的舒服感。所以,大家写代码的时候,要注意代码风格哦。
还有一个小细节,也值得我们注意,我们看下面这样一个例子,如果我们想要写一个代码,希望当b=2的时候,输出hehe,但是由于我的马虎,只写了一个等于号,我们知道,==在c语言中,一个等于号是赋值,两个等于号才是相等。==此时程序是这样的:

#include <stdio.h>

int main()
{
	int b = 0;

	if (b = 2)
		printf("hehe\n");
	return 0;
}

这个程序最终会输出什么呢?
在这里插入图片描述

我们的程序写错了,与我们的本义是不符合的。但是屏幕上却输出了hehe。这是因为:
在这里插入图片描述
所以,一个赋值表达式是真,也就是一个非0数,所以可以执行。那么,面对这样不易察觉的错误,我们有没有什么好的办法避免呢?我们将代码换一种写法来看看:
在这里插入图片描述
我们将2和b换了一下位置,我们发现编译器报错了,我们就很容易察觉到,这里少写了一个等于号。所以这提示我们,if括号里判断变量是否等于一个数字这种情况,我们把数字写在前面,这样有助于我们检查错误。这也同样提示了我们,代码风格的重要性。

2.2 switch语句

switch语句也是一种分支语句。 常常用于多分支的情况。
我们来看这样一个例子:
在这里插入图片描述
如果我们用if、else语句,将会非常的麻烦,对于这种多分支情况,switch语句会有条理方便很多。我们来看一下switch语句的应用方法:

switch(整型表达式)
{
语句项;
}

语句项是:

//是一些case语句:
//如下:
case 整形常量表达式:
语句;

case语句搭配break来使用,case进入,break跳出。
于是上面星期的代码我们可以写成这个样子:

#include <stdio.h>
int main()
{
	int day = 6;
	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;
}

在这里插入图片描述
注意,switch括号内放地是整型表达式哦。如果我们将day设置成float,代码就无法运行了。case后面必须要跟整型常量表达式。字符的也是整型常量,因为字符型对应的ASSIC码是整型。
在这里插入图片描述
我们说case和break搭配,但是是每一条case后,都要加break吗?非也。
如果我们改变一下需求:
在这里插入图片描述
我们的代码就可以改为这样来实现:

#include <stdio.h>

int main()
{
	int day = 6;
	switch (day)
	{
	    case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			printf("weekday\n");
			break;
		case 6:
		case 7:
			printf("weekend\n");
			break;
	}
	return 0;
}

在这里插入图片描述
所以,我们知道,并不是case后一定跟break,而是根据需要添加break。
但是,我们再想一下,如果,我们输入的数字超出范围了怎么办?比如,我们让day=9。

#include <stdio.h>

int main()
{
	int day = 9;
	switch (day)
	{
	    case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			printf("weekday\n");
			break;
		case 6:
		case 7:
			printf("weekend\n");
			break;
	}
	return 0;
}


在这里插入图片描述
这下啥也没输出。所有语句都被跳过了。有的时候,我们不希望发生这样的错误,所以我们就需要一点提示,于是default语句就对我们很重要啦。

在这里插入图片描述

#include <stdio.h>

int main()
{
	int day = 9;
	switch (day)
	{
	    case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			printf("weekday\n");
			break;
		case 6:
		case 7:
			printf("weekend\n");
			break;
		default:
			printf("您输入地信息有误\n");
	}
	return 0;
}

在这里插入图片描述
所以,为了成为一名严谨的程序员,在需要的时候要加上default语句哦。
还有一点值得注意的是,switch内部的语句并没有严格的顺序,所以代码变成这样也是可以的哦:

#include <stdio.h>

int main()
{
	int day = 9;
	switch (day)
	{
	default:
		printf("您输入地信息有误\n");
	case 6:
	case 7:
		printf("weekend\n");
		break;
	return 0;
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("weekday\n");
		break;
	}
}

有时候要卡死,有时候没有必要卡太死哦。
在这里插入图片描述

3. 循环语句

在这里插入图片描述
关于循环语句,我们之前在第一篇文章里以开端为例,已经比较详细地介绍啦,大家可以翻看一下第一篇博客哦。

3.1 while循环

//while 语法结构
while(表达式)
循环语句;

在这里插入图片描述

我们来看一个while循环的简单实例:

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

在这里插入图片描述
同样,在while循环中我们也引入了break。
在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

在这里插入图片描述
我们如果将代码换成如下,结果又是什么呢?

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		i = i + 1;
		if (i == 5)
			continue;
		printf("%d ", i);
	}
	return 0;
}


在这里插入图片描述
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

综上,我们知道,==break是中止循环,进入下一条语句,而continue是结束本次循环进入下一次循环。==这个非常重要,大家一定要注意它们的区别。对于新手小白,可能要花一段时间来弄明白这二者之间的区别,对于老手,也要注意它们的区别,不要马虎犯错。

3.2 for循环

for(表达式1;表达式2;表达式3)
循环语句;

表达式1为初始化部分,用于初始化循环变量的。 表达式2为条件判断部分,用于判断循环时候终止。 表达式3为调整部分,用于循环条件的调整。
在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
int main()
{
	int i = 0;
	//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}

在这里插入图片描述
我们对比一下while循环和for循环:
在这里插入图片描述
可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹。 for循环使用的频率也最高。

break和continue在for循环中区别和while中相同。

注意两点:
在这里插入图片描述
同时,for循环的三个条件是可以有缺失的。也可以有如下变种。

#include <stdio.h>

int main()
{
	//变种1
	for (;;)
	{
		printf("hehe\n");
	}
	//变种2
	int x, y;
	for (x = 0, y = 0; x<2 && y<5; ++x, y++)
	{
		printf("hehe\n");
	}
	return 0;
}

像变种1这样的写法,将无限循环,我们不建议这么做。

3.3 do while 循环

do
循环语句;
while(表达式);

在这里插入图片描述
do循环上来不做任何判断,所以循环至少执行一次。
来看一个do while的循环的例子:

#include <stdio.h>
int main()
{
	int i = 0;
	do
	{
		i++;
		printf("%d\n", i);
	} while (i<10);
	return 0;
}

在这里插入图片描述
同理,break和continue的语法在do while中也是一样的。

3.4 goto语句

C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

适用于下面这种情况:

for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 处理错误情况

后记

好的,这篇博文就介绍到这里啦。希望对大家有所帮助。我将尽力更新,希望我可以坚持下去。
在这里插入图片描述

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

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

相关文章

TicTacToe: 基于时序差分TD(0)算法的agent实现以及完整python实现框架

目录 1. 前言 2. TD(0) 3. 实现要点解读 3.1 Class Env 3.2 Class State 3.3 Class Agent 3.3.1 class TD0Agent(Agent) 3.3.2 class MinimaxAgent 3.3.3 class RandomAgent(Agent) 3.3.4 class HumanPlayer(Agent) 3.4 棋盘和玩家的表示 4. Utility Function 4.1…

Redis02之使用java代码操作Redis

目录 1、可视化管理工具redis-desktop-manager安装与配置 ​编辑 2、Java访问redis 注1&#xff1a;不需要记得API的方法&#xff0c;只需要查redis命令 3、web3.0设置 1、可视化管理工具redis-desktop-manager安装与配置 1.1 双击redis-desktop-manager-0.8.8.384.exe即可…

【LeetCode】2293. 极大极小游戏

2293. 极大极小游戏 题目描述 给你一个下标从 0 开始的整数数组 nums &#xff0c;其长度是 2 的幂。 对 nums 执行下述算法&#xff1a; 设 n 等于 nums 的长度&#xff0c;如果 n 1 &#xff0c;终止 算法过程。否则&#xff0c;创建 一个新的整数数组 newNums &#xf…

自动驾驶轨迹生成-贝塞尔(Bézier)曲线

引言 最近刚看完贝塞尔曲线&#xff0c;工作就遇到了相应的需求&#xff0c;所以写一下过程。主要讲的是自动驾驶中&#xff0c;车换道时用到贝塞尔曲线&#xff0c;当然其他的很多领域也会有&#xff0c;例如图形学等。 在车遇到障碍物或者是前车速度较慢的时候&#xff0c;…

【编译原理核心知识点总结】第三章、正则文法、NFA、DFA

阅读规范&#xff1a; 本文以重点为主&#xff0c;零碎知识点/相对不够重要的为辅助阅读内容&#xff0c;以脚注形式给出&#xff0c;点击脚注即可快速跳转。助解题目通常是为了帮助理解给出的题目&#xff0c;考试不考&#xff0c;若已理解可直接跳过。文中提到的课本是陈火旺…

SpringBoot 并发编程学习历程(绝对的干货)

如果一个项目总用单线程来跑&#xff0c;难免会遇到一些性能问题&#xff0c;所以再开发中&#xff0c;我们应该尽量适量的使用多线程&#xff08;在保证线程安全的情况下&#xff09;。 本教程大概目录&#xff1a; 1.模拟单线程情节 2.用Callable实现 并发编程 3.用DeferedR…

高并发系统设计 --基于bitmap的用户签到

业务需求分析 一般像微博&#xff0c;各种社交软件&#xff0c;游戏等APP&#xff0c;都会有一个签到功能&#xff0c;连续签到多少天&#xff0c;送什么东西&#xff0c;比如&#xff1a; 签到1天送10积分&#xff0c;连续签到2天送20积分&#xff0c;3天送30积分&#xff0…

Qt之QDrag的使用(含源码+注释)

一、效果示例图 提示&#xff1a;主控件&#xff08;CDragTest界面&#xff0c;UI中中包含CWidget界面&#xff09;&#xff1b;子控件&#xff08;CWidget界面&#xff0c;在CDragTest界面添加&#xff09; 提示&#xff1a;源码中拖拽数据设置的文本不同&#xff0c;是博主准…

【ONE·C || 分支循环】

总言 C语言&#xff1a;分支循环。 文章目录总言1、分支语句1.1、if语句1.1.1、基本格式1.1.2、逻辑真假与悬空else1.1.3、练习1.2、switch语句1.2.1、基本格式&#xff1a;break、case、default1.2.2、练习&#xff1a;switch语句嵌套2、循环语句2.1、while循环2.1.1、基本格式…

uniapp实现界面可任意拖动小图标

uniapp实现界面可任意拖动小图标一、问题&#xff1a;二、解决步骤2.1 根据uni-app官方提供的案例&#xff0c;创建组件2.2 在需要的界面引入组件使用额外注意一、问题&#xff1a; 例如购物车小图标可任意拖动 二、解决步骤 2.1 根据uni-app官方提供的案例&#xff0c;创建…

Kubernetes教程(二)---集群网络之 Flannel 核心原理

来自&#xff1a;指月 https://www.lixueduan.com 原文&#xff1a;https://www.lixueduan.com/posts/kubernetes/02-cluster-network/ 本文主要记录了 Kubernetes 集群网络方案之 Flannel 核心原理详解&#xff0c;包括其隧道方案中的两种&#xff1a;UDP 实现和 VXLAN 实现…

Mysql之增删改查

这里的增删改查主要是对应表中的数据&#xff0c;不像前一篇那个列类型&#xff0c;耳机具体的哪一条数据 Insert 其实我们前面都用过好多次了 比如下面那个 可以 关于那个表名后面加不加&#xff08;列类型&#xff09;&#xff0c;下面有解释 INSERT INTO shanpin VALUES…

关于yolov8一些训练的情况

U神出品了最新的yolov8&#xff0c;从公开的参数量来看确实很优秀&#xff01;&#xff01;&#xff01;&#xff01;比如下图得一些指标&#xff1a; 可以看到s模型640得map已经达到了44.9&#xff0c;v8n得map也已经达到了37.3&#xff0c;很强了&#xff0c;但是实际上是怎么…

Python爬虫之Scrapy框架系列(3)——项目实战【某瓣top250电影信息获取】

目录&#xff1a;1. 某瓣电影top250首页电影信息的获取&#xff01;1.创建项目&#xff1a;2.创建爬虫文件&#xff1a;3.运行爬虫文件&#xff1a;4.设置请求头&#xff1a;5.获取到电影名字&#xff1a;5.1 使用shell交互式平台&#xff1a;5.1.1 首先&#xff1a;打开我们的…

239页10万字“联、管、用”三位一体雪亮工程整体建设方案

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 目录 1、 项目概述 1.1 项目背…

用R语言绘制泰勒级数的逼近过程

文章目录泰勒级数是如何被发现的用图像理解Taylor级数的逼近过程前情提要 R语言微积分极限π,e,γ\pi, e, \gammaπ,e,γ洛必达法则连续性和导数数值导数差商与牛顿插值方向导数 泰勒级数是如何被发现的 如果我是泰勒&#xff0c;我会把思考的起点建立在这样的一个等式上 f(n…

Windows10电脑重装系统详细步骤(纯净版)

目录 前言&#xff1a; 一、准备工作 二、下载pe工具 三、下载系统镜像ISO文件 获取方式一 获取方式二 获取方式三 四、进入pe系统 1.检查以上的准备工作是否完成 2.然后拔出来u盘插入要重装的电脑上面 3.然后按电源键开机&#xff08;不能点击重启&#xff01;&…

【Git 从入门到精通】使用Git将本地代码推送到Github

文章目录一、创建远程库二、Git操作远程库1.推送代码2.克隆代码3.拉取代码4.Pull request5.常用命令总结一、创建远程库 打开github.com&#xff0c;点击右上角加号&#xff0c;点击第一个选项。 填写库的基本信息&#xff0c;如果你想代码开源就选择public&#xff0c;否则就…

开发模型和测试模型

开发模型瀑布模型特点&#xff1a;线性结构&#xff0c;每个阶段只执行一次&#xff0c;必须完成上一个才能执行下一个。是其他模型的基础框架缺点&#xff1a;测试后置&#xff0c;1&#xff09;前面各个阶段的遗留的风险推迟到测试阶段才被发现&#xff0c;导致项目大面积返工…

【7】SCI易中期刊推荐——图像处理领域(中科院4区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…