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

分支与循环

while循环

if与while的对比

if(表达式)语句;while(表达式)语句;

下面来看一个例子:

用 if 写:

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

用 while 写:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {while (1)printf("hehe");//while后面条件满足,死循环打印hehereturn 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.mzph.cn/pingmian/56185.shtml

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

相关文章

YOLOv8模型改进 第七讲 一种新颖的注意力机制 Outlook Attention

随着目标检测技术的不断发展&#xff0c;YOLOv8 作为最新一代的目标检测模型&#xff0c;已经在多个基准数据集上展现了其卓越的性能。然而&#xff0c;在复杂场景中&#xff0c;如何进一步提升模型的检测精度和鲁棒性依然是一个重要挑战。本文将探讨将 Outlook Attention 机制…

2024第四届”认证杯“数学中国全国大学生数学竞赛参赛通知

2024第四届“认证杯”数学中国 全国大学生数学竞赛报名通知 为了培养人才、服务教学、促进高等学校数学课程的改革和建设&#xff0c;增加大学生学习数学的兴趣&#xff0c;培养分析、解决问题的能力&#xff0c;发现和选拔数学创新人才&#xff0c;为青年学子提供一个展示数…

tortoisegit简单用法

一、基础设置 1.官网 https://tortoisegit.org/ TortoiseGit – Windows Shell Interface to Git 2.下载 3.安装 4.设置 5.克隆远程仓库 二、团队合作 1.在dev分支上创建分支 主分支&#xff1a;master 发开分支&#xff1a;dev 自己的分支&#xff1a;test_branch 2.修…

MySQL表的基本查询上

1&#xff0c;创建表 前面基础的文章已经讲了很多啦&#xff0c;直接上操作&#xff1a; 非常简单&#xff01;下一个&#xff01; 2&#xff0c;插入数据 1&#xff0c;全列插入 前面也说很多了&#xff0c;直接上操作&#xff1a; 以上插入和全列插入类似&#xff0c;全列…

小红书新ID保持项目StoryMaker,面部特征、服装、发型和身体特征都能保持一致!(已开源)

继之前和大家介绍的小红书在ID保持以及风格转换方面相关的优秀工作&#xff0c;感兴趣的小伙伴可以点击以下链接阅读~ 近期&#xff0c;小红书又新开源了一款文生图身份保持项目&#xff1a;StoryMaker&#xff0c;是一种个性化解决方案&#xff0c;它不仅保留了面部的一致性&…

智能交通与车联网:未来出行的创新变革

随着全球城市化进程的加速和交通需求的不断增加&#xff0c;传统的交通管理方式已经无法满足日益复杂的交通问题。智能交通&#xff08;Intelligent Transportation System, ITS&#xff09;和车联网&#xff08;Internet of Vehicles, IoV&#xff09;作为现代科技与交通行业深…

云手机:社交平台运营的热门工具

随着互联网的飞速发展&#xff0c;社交平台已经成为企业推广和营销的核心渠道。传统的运营方式已经无法满足高效运营的需求&#xff0c;而云手机作为新兴工具&#xff0c;逐渐成为社交平台运营的前沿趋势。本文将深入分析云手机如何优化社交平台的运营流程&#xff0c;助力企业…

outlook 添加企业邮箱账号出现 553 authentication is required 错误解决

系统报错如下 问题原因 发件服务器身份验证设置错误&#xff0c;或者未勾选发送服务器验证的选项。 解决方案 Outlook客户端 本文以Outlook 2016为例&#xff0c;具体操如下&#xff1a; 1、在Outlook客户端的电子邮件设置窗口中&#xff0c;单击其他设置&#xff1b; 2、…

【ICPC】The 2021 ICPC Asia Shanghai Regional Programming Contest H

Life is a Game #最小生成树 #重构树 #图论 #贪心 题目描述 A good problem should have a concise statement. You are given an array a a a of length n n n, initially filled with zeros, and another array b b b of length n n n. Your goal is to transform arr…

Pandas处理时间序列之光谱分析与聚类

import matplotlib.pylab as plt %matplotlib inline import numpy as np from numpy import fft import pandas as pd 一、光谱分析 • 将时间序列分解为许多正弦或余弦函数的总和 • 这些函数的系数应该具有不相关的值 • 对正弦函数进行回归 光谱分析应用场景 基于光谱的…

集师知识付费小程序:打造培训机构在线教育的金字招牌 集师知识付费系统 集师知识付费小程序 集师知识服务系统 集师线上培训系统 集师线上卖课小程序

在数字化浪潮的推动下&#xff0c;在线教育已成为教育领域的热门话题。而在众多在线教育平台中&#xff0c;集师知识付费小程序凭借其独特的定位和创新的模式&#xff0c;成功为培训机构打造了一张闪亮的在线教育金字招牌。 集师知识付费小程序&#xff0c;是一个集课程展示、…

哪款宠物空气净化器性价比高?希喂、米家和范罗士哪款更好?

这次我真的不是很想抱怨&#xff0c;是我男朋友真的很过分&#xff01;真的很过分&#xff0c;差点让我们两个分道扬镳。先听我说&#xff0c;这不是我和他都嫌家里太安静了吗&#xff0c;每天下班后两个人吃完饭就各玩各的手机&#xff0c;生活太无趣了&#xff0c;加上这几年…

软件功能测试重点和流程有哪些?专业软件测评服务公司推荐

软件功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0c;检查产品是否达到用户要求的功能。功能测试也叫黑盒测试或数据驱动测试&#xff0c;只需考虑需要测试的各个功能&#xff0c;不需要考虑整个软件的内部结构及代码.一般从软…

windows 安装 ElasticSearch

1、下载安装包 下载地址&#xff1a;https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.3-windows-x86_64.zip ElasticSearch 目录结构如下&#xff1a; 2、配置JDK环境 ES比较耗内存&#xff0c;建议虚拟机4G或以上内存&#xff0c;jvm1g以上的内存分…

告别信息过载!NotebookLM:你的AI学习与研究助手

在信息爆炸的时代&#xff0c;我们每天都面临着海量的信息&#xff0c;如何高效地处理和理解这些信息&#xff0c;成为了许多人面临的挑战。 Google 推出的 NotebookLM&#xff0c;或许能成为你的答案。这款结合了大语言模型 (LLM) 与用户笔记的 AI 笔记本&#xff0c;正在重新…

【网络安全】一篇文章带你了解CTF那些事儿

文章目录 一、什么是CTF&#xff1f;二、CTF需要学习那些知识&#xff1f;新书推荐适合新手自学的网络安全基础技能“蓝宝书”&#xff1a;《CTF那些事儿》内容简介读者对象专家推荐三、网络安全学习路线四、网络安全学习资料 一、什么是CTF&#xff1f; CTF&#xff08;Captu…

vue+element的confirm提示消息文字变色和换行

效果: 思路: 可以考虑采用模板字符串的思路实现 代码: this.confirm(您确定要<b style"Color: red">${text}</b>的数据项&#xff1f;<br/>单位名称: ${row.companyName} <br/>属性: ${row.attributeName}).then(() > {console.log(确定…

深入理解Java并发读写锁——ReentrantReadWriteLock

ReentrantReadWriteLock使用场景 ReentrantReadWriteLock 是 Java 的一种读写锁&#xff0c;它允许多个读线程同时访问&#xff0c;但只允许一个写线程访问&#xff08;会阻塞所有的读写线程&#xff09;。这种锁的设计可以提高性能&#xff0c;特别是在读操作的数量远远超过写…

预算不变,数据安全大升级!揭秘TRAID+的神奇之处

假期过后&#xff0c;公司弥漫着一股低沉的气息&#xff0c;公司的CTO&#xff0c;小威&#xff0c;正面对着一个令人头疼的问题——如何在不增加预算的情况下&#xff0c;提高公司的数据安全性。 如今各种勒索病毒层出不穷&#xff0c;或是因为硬盘的损坏或者员工的马虎使数据…

通信工程学习:什么是UART通用异步收发器

UART&#xff1a;通用异步收发器 UART&#xff0c;全称Universal Asynchronous Receiver/Transmitter&#xff0c;即通用异步收发传输器&#xff0c;是一种广泛应用于嵌入式领域的串行、异步、全双工通信协议。以下是关于UART的详细介绍&#xff1a; 一、定义与特点 定义&…