第二站:分支与循环(第二幕)

news2024/12/21 16:39:55

目录

三、循环

1.while循环

(1)基本原理与用法

(2)break在while循环中的作用

(3)continue在while循环中的作用

(4)一图总结while循环

2.for循环

(1)基本语法

(2)break在for循环中的作用

(3)continue在for循环的作用

(4)for循环几个建议

(5)变种的for循环

(6)一道经典的错误标准的零分

3.do while循环

(1)do while语句的语法

(2)break在do while循环中的作用

(3)continue在do while循环中的作用

4.一些经典的题目

5.猜数字游戏

6.goto语句

总结


三、循环

在c语言中,循环共有三种,while循环,for循环,do while循环。在之前我们粗略的了解了while循环,现在我们来详细了解这三种循环。

1.while循环

(1)基本原理与用法

我们在上一篇文章中已经了解了if语句的使用,我们这里复习一个简单的if语句。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int num = 0;
	if (num == 0)
		printf("hehe");
	return 0;
}

这段代码的意思很简单,只要if里面条件成立,则打印hehe。其实while循环和if语句是非常相似的。我们这里在上面的代码稍作修改,将if改为while会发生什么呢?

#include<stdio.h>
int main()
{
	int num = 0;
	while (num == 0)
		printf("hehe");
	return 0;
}

输出结果为一个无限打印hehe。对于while语句

一般是这样的形式

while(判断语句)

        循环体;

只有当判断语句为真的时候,可以执行下面的语句。执行完以后重新判断,如果仍为真,继续判断,直到为假才能跳出循环。当然上面这种情况下,循环体只能是一条语句,如果想要是多条语句则需要加上大括号

while(判断语句)

        {

                循环体;

        }

这样的话就是多条语句的循环,不难看出,和if语句是很相似的。

我们来实现一个简单的题目,打印出1---10的数字

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

(2)break在while循环中的作用

我们看这样一段代码

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

这段代码的运行结果是1 2 3 4

 也就是说,我们可以调试一下分析该代码,我们会发现当i等于5时,满足if的条件,执行了break,然后下一步我们的代码就跳出了while循环。程序就结束了。

也就是说break的作用是打破循环

结论:break在while循环中的作用:

在while循环中遇到break,就会停止后期所有的循环,直接终止循环

所以,while中的break是用于永久终止循环的

(3)continue在while循环中的作用

我们先看一段代码,并思考一下运行结果是什么

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

运行结果为,1234然后死循环但是不打印任何东西。

我们在给出一段代码。看看这个运行结果是什么

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

运行结果为

 现在已经不是死循环了,可以打印出来值,并且使得循环结束。

 那么continue的作用到底是什么呢?我们给出结论

continue在while循环中的作用:

continue是用于终止本次循环的,也就是本次循环中continue后面的代码都不会被再次执行

而是直接跳转到while语句的判断部分,进行下一次的循环入口判断。

(4)一图总结while循环

2.for循环

(1)基本语法

#include<stdio.h>
int main()
{
	for (表达式1; 表达式2; 表达式3)
	{
		表达式4;
	}
	return 0;
}

如图所示,for循环先执行表达式1,然后表达式2为判断,如果成立,则执行表达式4,然后执行表达式3,在进行表达式2判断,如此循环下去。

其中

表达式 1
表达式 1 初始化部分 ,用于初始化循环变量的。
表达式 2
表达式 2 条件判断部分 ,用于判断循环时候终止。
表达式 3
表达式 3 调整部分 ,用于循环条件的调整。

我们举一个简单的例子,打印1--10之间的数字

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

}

(2)break在for循环中的作用

我们来看这样一段代码

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

}

 运行结果为1 2 3 4

 可见,break在for循环中的作用与while循环一样

(3)continue在for循环的作用

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

}

运行结果为

 我们发现于while循环中有一定差异,因为while循环中不执行调整语句,而for循环执行调整语句,可见存在稍微的差异,导致结果不同,但是其实仍然具有一定的统一性,因为都是只跳过了本次循环的大括号里面的语句,while循环中,调整语句就在大括号里面,所以跳过,而for循环调整语句不在大括号里面,所以不跳过调整语句。

(4)for循环几个建议

①不可在for循环体内修改循环变量,防止for循环失去控制。

②建议for语句的循环控制变量的取值采用“前闭后开区间”写法

(5)变种的for循环

①下面代码中,for循环可以省略初始化部分,判断部分,调整部分,如果省略了判断部分,则判断恒为真。为死循环。

#include <stdio.h>
int main()
{
	for (;;)
	{
		printf("hehe\n");
	}
	return 0;
}

②这条语句总共打印9个hehe,因为是两个for循环的嵌套使用

#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
//这里打印多少个hehe?
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			printf("hehe\n");
		}
	}
}

③这段代码省略了初始化部分,只打印3个hehe,因为j不会被再次初始化

#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	//如果省略掉初始化部分,这里打印多少个hehe?
	for (; i < 3; i++)
	{
		for (; j < 3; j++)
		{
			printf("hehe\n");
		}
	}
}

 ④使用了多余一个变量来控制循环,如下所示,结果为两个hehe

#include<stdio.h>
int main()
{
//使用多余一个变量控制循环
	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
	{
		printf("hehe\n");
	}
	return 0;
}

(6)一道经典的错误标准的零分

#include <stdio.h>
int main()
{
	int i = 0;
	int k = 0;
	for (i = 0, k = 0; k = 0; i++, k++)
		k++;
	return 0;
}

这段代码中,判断语句是赋值的,k赋值后是0,为假,因为只有0为假,非零都为真。所以,这道题什么都不打印。

3.do while循环

(1)do while语句的语法

#include<stdio.h>
int main()
{
    do
    {
        //代码块
    } while();
    return 0;
}

在do while语句中,无论条件是否成立,代码是先执行一次,然后在进行判断的,如果为真,则进入循环。值得注意的是,do while的判断语句后面有一个分号,这点于while和for循环不太一样。

我们仍然举一个简单的例子,打印1---10

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

(2)break在do while循环中的作用

我们看这样一段代码

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

输出结果为

 可见,break的作用为打破循环。与在while和for循环中的作用一样

(3)continue在do while循环中的作用

我们看这样一段代码

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

输出结果为12345555555555555

 可见continue的作用仍为,结束本轮循环,也就是跳过本次循环的大括号内剩余的内容。重新进入判断。

4.一些经典的题目

为了使文章条理更加清晰一些,该部分我决定将其放在下一篇博客中。后续会将链接贴在这个位置

5.猜数字游戏

为了使文章条理更加清晰一些,该部分也同样将放到下一篇博客中,后续会将链接贴到这个位置

6.goto语句

C 语言中提供了可以随意滥用的 goto 语句和标记跳转的标号。
从理论上 goto 语句是没有必要的,实践中没有 goto 语句也可以很容易的写出代码。
但是某些场合下 goto 语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用 break 是达不到目的。它只能从最内层循环退出到上一层的循环。
如下代码所示,是一个简单的goto使用
#include<stdio.h>
int main()
{
	flag:
		printf("haha");
		goto flag;
		return;
}

我们在举一个例子,是goto语句在关机程序中的使用

一个关机程序
程序执行起来就倒计时关机,60秒后关机
如果输入:我是猪,就取消关机

#include<stdio.h>
#include<windows.h>
int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");
again:
	printf("你的电脑将在60s后关机,如果输入我是猪,就取消关机");
	scanf("%s", input);
	if (0 == strcmp(input, "我是猪"))
	{
		system("shutdown -a");
	}
	else
	{
		goto again;
	}
}

这就是我们的代码,当我们输入我是猪时候,就会停止关机

其中有几个库函数和命令需要大家了解一下

showdown -s -t 60的意思是60秒后关机

showdown -a的意思是取消关机

当然还有很多命令我们这里附上一个链接,希望大家可以去这里面都自己学习一下这个命令。

showdown的命令拓展


总结

本节主要讲述了,三大循环,以及goto循环的一些应用。如果对你有帮助的话,不要忘记点赞加关注哦。

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

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

相关文章

[SpringBoot] 多模块统一返回格式带分页信息

✨✨个人主页:沫洺的主页 &#x1f4da;&#x1f4da;系列专栏: &#x1f4d6; JavaWeb专栏&#x1f4d6; JavaSE专栏 &#x1f4d6; Java基础专栏&#x1f4d6;vue3专栏 &#x1f4d6;MyBatis专栏&#x1f4d6;Spring专栏&#x1f4d6;SpringMVC专栏&#x1f4d6;SpringBoot专…

算法刷题路线总结与相关资料分享

算法刷题路线总结与相关资料分享前言一、算法刷题路线总结二、算法题刷题步骤三、基础数据结构与算法知识1、时间复杂度2、空间复杂度3、线性表4、栈与队列5、树四、算法学习相关资料推荐1.数据结构与算法基础2.专项刷题路线资料3.算法课程视频资料后记前言 本文为算法刷题路线…

双十一数码产品哪些值得买?双十一好物产品分享

双十一必然是数码产品最值得买的&#xff0c;因为这类产品的优惠力度往往是最大的&#xff0c;所以每年的双十一都是升级数码设备的好时机&#xff0c;今天为大家带来的是便是个人推荐的双十一数码好物。好了&#xff0c;废话不再多说&#xff0c;我们开车吧。 一、不伤耳的骨…

postman 实用教程(含带 token 访问需登录权限的接口)

下载安装 Postman 访问官网下载安装 Postman https://www.postman.com/downloads/?utm_sourcepostman-home 新建文档 右键菜单可以重命名 新建接口 选择接口类型输入接口若传入参数格式为 json &#xff0c;则选择 Body 中的 raw 和 JSON输入传入的参数&#xff08;json格式&a…

计算机网络--数据链路层

今天来讲网络协议栈的最后一层&#xff0c;数据链路层(物理层我们不考虑了)&#xff0c;我们之前学到&#xff0c;TCP协议提供了数据传输的可靠性&#xff0c;IP层决定数据报从哪到哪&#xff0c;那么数据报是如何从一个结点到下一个结点呢&#xff1f;得到相应如何返回呢&…

(02)Cartographer源码无死角解析-(09) gflags与glog简介、及其main函数讲解

本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文…

软件工程结构化设计

目录 结构化分析与结构化设计的关系&#xff1a; 体系结构设计概念&#xff1a; 图形工具&#xff1a; 层次图&#xff1a;调用关系​编辑 HIPO图&#xff1a;层次图IPO图 软件结构图&#xff1a; 软件设计原则&#xff1a; 模块化&#xff1a; 模块划分注意事项&#xf…

巴什博弈——范围拿物品问题

巴什博弈 巴什博弈&#xff08;Bash game&#xff09; 是一个双人博弈&#xff1a;有一堆总数为n的物品&#xff0c;2名玩家轮流从中拿取物品。每次至少拿1件&#xff0c;至多拿m件&#xff0c;不能不拿&#xff0c;最终将物品拿完者获胜。 巴什博弈除了两人轮流按一定数量拿物…

【黄啊码】MySQL入门—14、细说数据库的MVCC机制

大家好&#xff0c;我是黄啊码。上一篇文章中&#xff0c;我们讲到了锁的划分&#xff0c;以及乐观锁和悲观锁的思想。今天我们就来看下 MVCC&#xff0c;它就是采用乐观锁思想的一种方式。那么它到底有什么用呢&#xff1f; 我们知道事务有 4 个隔离级别&#xff0c;以及可能…

共谋韬略、共巢未来,电巢与韬略“战略合作签约仪式”圆满举办!

前言 2022年10月27日下午&#xff0c;电巢科技与韬略科技齐聚深圳南山&#xff0c;共同举办了隆重的战略合作签约仪式&#xff0c;双方就整合核心资源、共同打造高质量数字化内容等战略方针达成了一致&#xff0c;携手开启合作新篇章。 电巢科技和韬略科技基于相契合的发展战略…

Numpy基础教程

1 Numpy 对象2 Numpy创建numpy.array 构造器来创建numpy.emptynumpy.zerosnumpy.onesnumpy.arangeNumpy索引3 Numpy常用操作numpy.reshapenumpy.reshape(arr,newshape,order C)numpy.transposenumpy.expand_dimsnumpy.squeezeNumpy功能十分强大的python扩展库&#xff0c;数学…

基于Java+Springboot+Vue+elememt美食论坛平台设计实现

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取联系&#x1f345;精彩专栏推荐订阅&#x1f447;&#x1f…

07-树(Tree)结构分析

文章目录树(Tree)结构分析什么是树&#xff1f;树中的相关名词如何理解&#xff1f;什么是二叉树&#xff1f;什么是二叉搜索树&#xff1f;什么是AVL树&#xff1f;什么是2-3树&#xff1f;什么是红黑树&#xff1f;总结&#xff08;Summary&#xff09;树(Tree)结构分析 什么…

【飞桨PaddleSpeech语音技术课程】— 语音识别-流式服务

FastAPI websocket 流式语音识别服务 0. 背景 流式语音识别(Streaming ASR)或者在线语音识别(Online ASR) 是随着输入语音的数据不断增加&#xff0c;实时给出语音识别的文本结果。与之相对的是非实时或者离线语音识别&#xff0c;是传入完整的音频数据&#xff0c;一次给出整…

ppocrlabel简单教学

前言 给我们小白成员的快速上手ppocrlabel的指南 1. ppocr环境配置 建议是先创建一个虚拟环境 【直接参考】&#xff1a;https://blog.csdn.net/weixin_42708301/article/details/119864744 2. ppocrlabel环境安装 【参考文档】PaddleOCR-release-2.6\PPOCRLabel\README_c…

将STM32 内部Flash虚拟成优盘,进行IAP升级

书接上回&#xff0c;上篇文章已经成功的将 STM32 内部FLASH虚拟成优盘进行文件存储了。 【将 STM32 内部Flash虚拟成优盘】https://blog.csdn.net/qq_44810226/article/details/127508789 然后我们开始固件升级流程&#xff1a; 从上图可以看出&#xff0c;固件存储的位置是不…

Python-代码封装思想

继上文所将讲的pythonrequestsUnittest框架&#xff0c;本文将继续分享python代码的进一步封装思想&#xff0c;来提高代码的整体运行效率及整洁性&#xff0c;本文以接口测试框架为例进行讲解。 关于Unittest单元测试框架的具体使用方法链接链接&#xff08;点击跳转&#xf…

MMEngine理解

MMEngine理解1 简介1.1 架构1.2 模块介绍1.2.1 核心模块与相关组件1.2.1 公共基础模块2 上手示例2.1 构建模型2.2 构建数据集和数据加载器2.3 构建评测指标2.4 构建执行器并执行任务3. 基础模块3.1 注册器&#xff08;Registry&#xff09;3.1.1 什么是注册器3.1.2 使用流程3.1…

OSPF路由协议(二)

作者介绍&#xff1a; ⭐️作者&#xff1a;小刘在C站 ❄️每天分享课堂笔记&#xff0c;一起努力&#xff0c;共赴美好人生&#xff01; ☁️夕阳下&#xff0c;是最美的绽放。 目录 一.Router id 二.DR,BDR 三.DR BDR 选举过程 四.ospf 度量值 cost 代价 五.ospf 的数据…

部署vue项目到阿里云服务器

一般前端工程师只会使用npm run serve 在开发环境下验证&#xff0c;那么如何把npm run build 打出的包部署到服务器上进行上线呢&#xff1f;这篇文章就详细阐述这一流程。 1. 购买或试用阿里云服务器 作为新用户可以试用一个月阿里云服务器&#xff0c;阿里云官方网址如下&a…