【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.rhkb.cn/news/447860.html

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

相关文章

Java双亲委派机制讲解和常见问题解决案例示范

1. 引言 Java 的类加载机制是 JVM 运行时系统的核心之一&#xff0c;而其中的双亲委派机制&#xff08;Parent Delegation Model&#xff09;是保证 Java 平台安全性与可扩展性的关键设计。双亲委派机制确保了 Java 体系中类的加载顺序&#xff0c;防止了类的重复加载与覆盖&a…

ARP欺骗的多种手法

学习参考&#xff1a; ARP欺骗的各种d玩法-CSDN博客 https://juejin.cn/post/7383702153892954164 一、什么是ARP欺骗 1.什么是ARP&#xff1f; ARP (Address Resolution Protocol) 是一种网络层协议&#xff0c;用于将 IP 地址转换为物理地址&#xff08;MAC 地址&#xff0…

湖科大-计网真题笔记

09 序列号不涉及首部

前端开发笔记-- 黑马程序员4

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 css 三角写法用户界面鼠标样式取消表单轮廓vertical-align文本溢出 html5 新标签多媒体标签视频标签![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d85d…

深入解析 HashMap 的 remove() 方法及其相关实现

HashMap 是 Java 中最常用的集合类之一&#xff0c;它提供了高效的键值对存储和检索功能。本文将详细解析 HashMap 的 remove() 方法及其相关的内部实现&#xff0c;包括 removeNode() 和 removeTreeNode() 方法。通过这些方法&#xff0c;我们可以了解 HashMap 如何高效地移除…

中国剩余定理 C++

题目 解题思路 原链接&#xff1a;https://www.acwing.com/solution/content/3539/ 大致步骤&#xff1a; 将第2,3,4…n个方程不断与第一个方程合并&#xff0c;得到方程a1k1a2k2m2-m1;用扩展欧几里得算法解出a1k1a2k2gcd(a1, a2)的结果&#xff0c;再将结果扩大(m2-m1)/d倍即…

Linux:进程控制(三)——进程程序替换

目录 一、概念 二、使用 1.单进程程序替换 2.多进程程序替换 3.exec接口 4.execle 一、概念 背景 当前进程在运行的时候&#xff0c;所执行的代码来自于自己的源文件。使用fork创建子进程后&#xff0c;子进程执行的程序中代码内容和父进程是相同的&#xff0c;如果子进…

12.2 Linux_进程间通信_共享内存

概述 什么是共享内存&#xff1a; 共享内存又叫内存映射&#xff0c;可以通过mmap()映射普通文件。 实际上就是将磁盘中的一个文件映射到内存的一个缓冲区中去&#xff0c;这样进程就可以直接将这块空间当作普通内存来访问&#xff0c;不需要再使用I/O中的read/write去访问这…

CV实战01 YOLOv5实现图像分割

网上翻了一天&#xff0c;没找到称心的教程&#xff0c;最后发现还是Ultralytics官方的教程文档好用&#xff01;这里贴上官方教程一起学习&#xff01; 【1&#xff1a;找到官方教程文档】 yolov5官方下载地址&#xff1a;GitHub - ultralytics/yolov5: YOLOv5 &#x1f680…

数字后端零基础入门系列 | Innovus零基础LAB学习Day1

一 Floorplan 数字IC后端设计如何从零基础快速入门&#xff1f;(内附数字IC后端学习视频&#xff09; Lab5-1这个lab学习目标很明确——启动Innovus工具并完成设计的导入。 在进入lab之前&#xff0c;我们需要进入我们的FPR工作目录。 其中ic062为个人服务器账户。比如你端…

多线程代码案例

案例一.单例模式 单例模式是一种设计模式;类似于棋谱,有固定套路,针对一些特定场景可以给出一些比较好的解决方案; 只要按照设计模式来写代码,就可以保证代码不会太差,保证了代码的下限; --------------------------------------------------------------------------------…

【优选算法】(第三十六篇)

目录 ⼆叉树的锯⻮形层序遍历&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 ⼆叉树的最⼤宽度&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 ⼆叉树的锯⻮形层序遍历&#xff08;medium&#xff09; 题目解析 1.题目链接&#xf…

植物大战僵尸杂交版

最新版植物大战僵尸杂交版 最近本款游戏火爆 下载资源如下&#xff1a; win版本&#xff1a;2.3.7 链接&#xff1a;下载地址 提取码&#xff1a;9N3P Mac&#xff08;苹果版本&#xff09;&#xff1a;2.0.0 链接&#xff1a;下载地址 提取码&#xff1a;Bjaa 介绍&#xff…

mysql/doris 计算两个时间相差n天n时n分示范

mysql/doris 计算两个时间相差n天n时n分示范 两个时间&#xff1a;so.create_time&#xff0c;so.update_time CONCAT(FLOOR(DATEDIFF(HOUR ,so.create_time,so.update_time)/24),天,DATEDIFF(HOUR ,so.create_time,so.update_time)%24,时,DATEDIFF(MINUTE ,so.create_time,so…

【重学 MySQL】六十六、外键约束的使用

【重学 MySQL】六十六、外键约束的使用 外键约束的概念关键字主表和从表/父表和子表外键约束的创建条件外键约束的特点外键约束的创建方式外键约束的删除外键约束的约束等级外键约束的级联操作外键约束的示例外键约束的作用开发场景阿里开发规范 在MySQL中&#xff0c;外键约束…

(已解决)vscode使用launch.json进行debug调试报错:Couldn‘t spawn debuggee:embedded null byte

Launch.json 进行debug时报错&#xff1a; 主要原因是vscode全局配置被整乱了&#xff0c;下面是个人解决的方法&#xff0c;以供参考. 在网上也寻找过解决方法&#xff0c;有的说是&#xff0c;在launch.json中&#xff0c;添加一行"python":"/root/miniconda3…

git版本控制软件,操作方法

git版本库操作 1. 注册用户信息 git config --global (邮箱和用户名) 2. 创建工作区 git init 3. 编写文件 vim readme.txt 4. 把文件放到暂存区 git add readme.txt 5. 查看工作区状态 git status 6. 把文件放到本地版本库里 git commit -m "" filename 7. 查看日志…

总结拓展十四:批次管理(2)

1、批次管理后台配置 1.1 批次管理级别配置(T-code:OMTC) ——路径&#xff1a;IMG->后勤-常规->批次管理->指定级别并激活状态管理 1.2 批次状态管理配置(T-code:OMTC) ——路径&#xff1a;IMG->后勤-常规->批次管理->指定级别并激活状态管理 批状态管…

2.1.ReactOS系统NtReadFile函数的实现。

ReactOS系统NtReadFile函数的实现。 ReactOS系统NtReadFile函数的实现。 文章目录 ReactOS系统NtReadFile函数的实现。NtReadFile函数的定义NtReadFile函数的实现 NtReadFile()是windows的一个系统调用&#xff0c;内核中有一个叫NtReadFile的函数 NtReadFile函数的定义 NTS…

【Go初阶】两万字快速入门Go语言

初见golang语法 package mainimport "fmt"func main() {/* 简单的程序 万能的hello world */fmt.Println("Hello Go")} 第一行代码package main定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包&#xff0c;如&#xff1a;package main…