【C】分支与循环2--while/for/do-while/goto以及break和continue在不同循环中的辨析~

news2024/10/17 9:38:59

分支与循环

while循环

if与while的对比

if(表达式)
	语句;

while(表达式)
	语句;

下面来看一个例子:

用 if 写:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	if (1)
		printf("hehe");//if后面条件满足,打印一次hehe
	return 0;
}

用 while 写:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	while (1)
		printf("hehe");//while后面条件满足,死循环打印hehe
	return 0;
}

可以看出,它们的区别就是while可以实现循环

while语句的执行流程

在这里插入图片描述
首先要执行判断表达式,表达式的值为0,循环直接结束
表达式的值不为0,则执行循环语句
语句执行完后继续判断,是否进行下一次循环

  • 练习1:在屏幕上打印1~10
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int i = 1;
	while (i <= 10) {
		printf("%d ", i);
		i++;
	}
	return 0;
}

输出如下:

在这里插入图片描述

  • 练习2:输入一个正的整数,逆序打印这个整数的每一位
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int num;
	int n;
	scanf("%d", &num);
	while (num!=0) {
		n = num % 10;
		printf("%d", n);
		num /= 10;
	}
	return 0;
}

输入12345
输出如下:

在这里插入图片描述

for循环

for(表达式1;表达式2;表达式3

表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整

while:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int i = 1;//循环变量的初始化
	while (i <= 10) //循环的判断条件
	{
		printf("%d ", i);
		i++;//循环变量的调整
	}
	return 0;
}

for循环的执行流程

首先执行 表达式1初始化循环变量,接下来就是执行表达式2的判断部分
表达式2的结果如果==0,则循环结束;表达式2的结果如果!=0,则执行循环语句
循环语句执行完后,再去执行表达式3,调整循环变量
然后再去表达式2 的地方执行判断,表达式2的结果是否为0,决定循环是否继续
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2循环,语句表达式3在循环.

在这里插入图片描述

用for循环打印1~10

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int i = 0;
	for (int i = 1;i <= 10;i++) {
		printf("%d ", i);
	}
	return 0;
}
  • 练习:计算1~100之间三的倍数的和
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int i = 0,sum=0;
	for (i = 1;i <= 100;i++) {
		if (i % 3 == 0) {
			sum += i;
		}
	}
	printf("%d", sum);
	return 0;
}

或者优化一下:

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

结果是一样的:

在这里插入图片描述

do-while

语法形式

do
	语句;
while(表达式)

特征:循环体至少被执行一次

执行流程

在这里插入图片描述

  • 练习1:用do-while打印1~10的值
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int i = 1;
	do
	{
		printf("%d ", i);
		i++;
	} while (i <= 10);
	return 0;
}
  • 练习2:输入一个正整数,计算一下这个数是几位数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int num,count=0;
	scanf("%d",&num);
	do
	{
		num /= 10;
		count++;
	} while (num);//当num为真(非零),执行
	printf("%d ", count);
	return 0;
}

break和continue语句

在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环,这就需要breakcontinue 两个关键字

break 的作用是用于永久的终止循环,只要break 被执行,直接就会跳出循环,继续往后执行

continue 的作用是跳过本次循环中continue 后边的代码,在 for 循环和 while循环中有所差异的

while循环中的break和continue

while:

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

输出结果为:

在这里插入图片描述

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

输出结果为:
打印 1 2 3 4 光标在闪烁

是因为:
i==5时,continue会跳过printf和i++语句

然后判断while里面的语句是否为真,显然为真,则继续执行循环

此时的i仍为5…,循环会一直在i==5时执行下去,所以为死循环

在这里插入图片描述

for:

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

输出结果为:

在这里插入图片描述

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

输出结果为:

在这里插入图片描述

是因为·:
i==5时,continue会跳过printf和i++d语句

然后i++,i变为6,循环继续执行

如果将for循环的代码变为这样:

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

那么输出结果也为死循环

在这里插入图片描述
执行的顺序与while循环相同

do-while循环中的break和continue

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

输出结果如下:

在这里插入图片描述

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

输出结果仍为死循环

在这里插入图片描述

  • 练习:判断下面代码的输出
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int i = 1;
	while (i <= 10) {
		i++;
		if (i == 5)
			continue;
		printf("%d ", i);
	}
	return 0;
}

结果是:

在这里插入图片描述

循环的嵌套

  • 练习:打印100~1200之间的素数(只能被1和本身整除的数字)
  • 判断素数方法:拿2~i-1之间的数字去试除i
  • 如果找到了一个数字能整除i,则i不是素数
  • 如果没有数字能整除i,则i是素数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int i = 0;
	for (i = 100;i <= 200;i++) {
		int flag = 1;//假设i是素数
		int j = 0;
		for (j = 2;j < i;j++) {
			if (i % j == 0) {
				flag = 0;//i不是素数
				break;
			}
		}
		if (flag == 1) {
			printf("%d ", i);//是素数
		}
	}
	return 0;
}

输出为:

在这里插入图片描述

但是这个代码效率不够高

思考一下:

如果n=a*b到时候,a和b中至少有一个数字<=根号n
所以,如果n不是素数,一定有个因子在2~根号n之间
如果在2~根号n之间没有摘到能整除n的数字,那么n就是素数

故,代码可以优化为:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>//数学相关的头文件
int main() {
	int i = 0;
	for (i = 101;i<= 200;i+=2) //偶数不可能是素数
	{
		int flag = 1;
		int j = 0;
		for (j = 2;j < sqrt(i);j++) 
		{
			if (i % j == 0) {
				flag = 0;
				break;
			}
		}
		if (flag == 1) {
			printf("%d ", i);
		}
	}
	return 0;
}

goto语句

goto语句可以实现在同一个函数内跳转到设置好的标号处

  • eg1:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>//数学相关的头文件
int main() {
	printf("hehe\n");
	goto next;
	printf("haha\n");
next:
	printf("heihei\n");
	return 0;
}

输出为:

在这里插入图片描述
可见,跳过了haha的输出

  • eg2:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>//数学相关的头文件
int main() {
again:
	printf("hehe\n");
	goto again;
	return 0;
}

输出结果为:
hehe的死循环

在这里插入图片描述

代码中出现的goto语句太多的话,代码的执行流程就比较乱,可控性不高

但在多层循环的代码中,如果想快速跳出,goto就非常方便

1 for(...)
{
	for(...)	
	{
		if(disaster)	
			goto error;	
	}	
}
 error;

for循环想提前退出得使用break,一个 break 只能跳出一层for循环,如果3层循环嵌套就得使用3个 break 才能跳出循环,所以此时使用goto语句就会更加的快捷

END
截至到这里,分支与循环就完事一半啦
已经很晚了,要早点休息喔~zzz

最后…

“我们不全是长篇小说,也不全是短篇故事,
最后的最后,我们成为一部人生作品集。”

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

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

相关文章

数据结构——排序(2)

数据结构——排序(2) 文章目录 数据结构——排序(2)前言&#xff1a;1.快速排序&#xff08;非递归版本&#xff09;基本步骤&#xff1a;代码实现 2.归并排序算法思想&#xff1a;核心步骤&#xff1a;代码实现&#xff1a;特征总结&#xff1a; 3.计数排序&#xff08;非比较…

跨境电商独立站的本地化

随着全球电商的快速发展,越来越多的跨境电商选择建立独立站以摆脱平台限制,打造品牌影响力。独立站的成功不仅依赖于技术能力和供应链管理,更取决于对目标市场的本地化策略。 本文将从网站建设、商品信息展示、SEO推广等方面分析跨境电商独立站如何进行本地化适配,并讨论如…

SMARTFORM 条形码和二维码

本文主要是记录了二维码和条形码的创建以及在SMARTFORMS的使用 文章目录 SMARTFORM 条形码创建新的BARCODE创建条形码样式创建段落样式SMARTFORM调用条形码 SMARTFORM 二维码创建二维码Module Size 调节二维码的尺寸Module Size: 像素值ErrCorrLev : 容错率二维码的使用 SMARTF…

Springboot3+druid+jasypt+application.yml配置文件数据库密码加密技术

说明 开发环境我们经常把数据库密码直接明文暴露在配置文件中,但是在生产环境,出于安全考虑,必须对数据库密码进行加密。 Jasypt是一个简单易用的Java加密工具库。Jasypt支持多种加密算法,如AES、SHA512、AES_256等,以适应不同的安全需求,可以轻松将加密技术应用于配置…

虚拟机错误:‘VirtualBox Host-Only Ethernet Adapter #2‘

这个错误确实让我很难受。同时我也找了很多的方法&#xff0c;最终得到了这种方法是比较有效的。 参考 https://www.virtualbox.org/ticket/16807

2023年“网络建设与运维”广西省赛试题复盘

2023年“网络搭建与应用”省赛试题复盘 第一部分&#xff1a;网络搭建及安全部署项目 &#xff08;500分&#xff09; 一、竞赛内容分布 “网络搭建与应用”竞赛共分二个部分&#xff0c;其中&#xff1a; 第一部分&#xff1a;网络搭建及安全部署项目 第二部分&#xff1a;服…

Uncaught (in promise) TypeError: Cannot convert object to primitive value

使用vue3的时候报了这个错误&#xff0c;而且还同时报了一个警告 说一下我这里这个错误和警告的原因&#xff0c;是因为我把传给 第三方组件的值 也当做了 第三方组件的 ref&#xff0c;可能没太说清楚&#xff0c;所以接下来看代码&#xff0c;我这里使用的第三方组件是 vxe-t…

Vue2项目中使用 echarts(5.2.2)图表组件含代码(二)

1.图表预览 2.注释说明 Vue 的组件开发 通过 props 定义外部传入的属性&#xff0c;例如 className、width、height、autoResize、chartData 等。使用 Vue 的生命周期钩子函数 mounted 进行 ECharts 的实例化&#xff0c;确保组件加载完毕后才初始化图表。通过 watch 监听 ch…

半小时速通RHCSA

1-7章: #01创建以上目录和文件结构&#xff0c;并将/yasuo目录拷贝4份到/目录下 #02查看系统合法shell #03查看系统发行版版本 #04查看系统内核版本 #05临时修改主机名 #06查看系统指令的查找路径 #07查看passwd指令的执行路径 #08为/yasuo/ssh_config文件在/mulu目录下创建软链…

【Vue】Vue扫盲(四)组件化思想与简单应用

【Vue】Vue扫盲&#xff08;一&#xff09;事件标签、事件修饰符&#xff1a;click.prevent click.stop click.stop.prevent、按键修饰符、及常用指令 【Vue】Vue扫盲&#xff08;二&#xff09;指令&#xff1a;v-for 、v-if、v-else-if、v-else、v-show 【Vue】Vue扫盲&…

Oracle-19g数据库的安装

简介 Oracle是一家全球领先的数据库和云解决方案提供商。他们提供了一套完整的技术和产品&#xff0c;包括数据库管理系统、企业级应用程序、人工智能和机器学习工具等。Oracle的数据库管理系统是业界最受欢迎和广泛使用的数据库之一&#xff0c;它可以管理和存储大量结构化和…

内核定时器API实现点灯

1.内核定时器 定时器是一个很常用的功能&#xff0c;需要周期性处理的工作都要用到定时器。 Linux 内核定时器 采用系统时钟来实现&#xff0c;并不是6ull里面的硬件定时器。 Linux 内核定时器使用很简单&#xff0c;只需要提供超时时间(相当于定时值)和定时处理函数即…

高阶数据结构与算法——红黑树の奥秘

1.认识红黑树 1.1红黑树的概念 红⿊树是⼀棵⼆叉搜索树&#xff0c;他的每个结点增加⼀个存储位来表⽰结点的颜⾊&#xff0c;可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束&#xff0c;红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍&#xff0c…

graphrag学习总结

学习视频&#xff1a;b站链接 项目链接 GraphRAG 的基本概念 Document&#xff08;文档&#xff09;&#xff1a;系统中的输入文档。这些文档要么代表CSV中的单独行&#xff0c;要么代表单独的txt文件。 TextUnit&#xff08;文本块&#xff09;&#xff1a;要分析的文本块。…

pdf阅读软件有哪些?5个软件帮助你快速进行pdf阅读

pdf阅读软件有哪些&#xff1f;5个软件帮助你快速进行pdf阅读 如果你正在寻找优秀的PDF阅读软件&#xff0c;以下推荐的5款软件能够帮助你快速、轻松地阅读和管理PDF文件。这些工具各具特色&#xff0c;适用于不同的使用需求&#xff0c;无论是注释、签名、还是管理大文件&…

使用Rollup.js快速开始构建一个前端项目

Rollup 是一个用于 JavaScript 项目的模块打包器&#xff0c;它将小块代码编译成更大、更复杂的代码&#xff0c;例如库或应用程序。Rollup 对代码模块使用 ES6 模块标准&#xff0c;它支持 Tree-shaking&#xff08;摇树优化&#xff09;&#xff0c;可以剔除那些实际上没有被…

lwip多线程使用说明,注意事项

lwIP: Common pitfalls 相关问题&#xff1a; lwIP - A Lightweight TCP/IP stack - Bugs: bug #56531, Missing locking in tcp_input() [Savannah] 我也碰到了差不多情况

goDoH:一款使用了DNS-over-HTTPS作为传输端口的C2框架

工具介绍 goDoH是一款概念验证命令与控制框架&#xff0c;该工具采用Golang开发&#xff0c;并使用了DNS-over-HTTP作为传输介质。 项目依赖 goDoH的代码构建需要使用到Dep&#xff08;【GitHub传送门】&#xff09;&#xff0c;Dep是一款针对Go语言的依赖管理工具。 在mac…

【vue】vue-router_ vue3路由管理器

代码获取 vue-router_ vue3路由管理器 ⼀、基本介绍 1. 单⻚应⽤程序介绍 1.1 概念 单⻚应⽤程序&#xff1a;SPA(Single Page Application)是指所有的功能都在⼀个HTML⻚⾯上实现 1.2 具体⽰例 单⻚应⽤⽹站&#xff1a; ⽹易云⾳乐 https://music.163.com/ 多⻚应⽤⽹…

【Python语言进阶(二)】

一、函数的使用方式 将函数视为“一等公民” 函数可以赋值给变量函数可以作为函数的参数函数可以作为函数的返回值 高阶函数的用法&#xff08;filter、map以及它们的替代品&#xff09; items1 list(map(lambda x: x ** 2, filter(lambda x: x % 2, range(1, 10)))) # filter…