C/C++之while(do-while)详细讲解
目录
while循环有两个重要组成部分:
while 是一个预测试循环
无限循环
do-while 循环
while循环有两个重要组成部分:
- 进行 true 值或 false 值判断的表达式;
- 只要表达式为 true 就重复执行的语句或块;
图 1 显示了 while 循环的一般格式,右侧流程图直观地描绘了其工作原理。

图 1 while 循环的语句结构及流程图
现在来看一看 while 循环的每个部分。第一行,有时称为循环头,由关键字 while 组成,后跟待测试的条件,括在括号中。条件由任何可被判断为 true 或 false 的表达式表示。接下来是循环体,它包含一个或多个 C++语句。
循环的工作原理是,首先判断条件表达式的值,如果它是真的,则循环体中的每个语句都被执行;然后,再次测试条件,如果条件表达式仍然为 true,则循环体中的每个语句将再次被执行。如此循环往复,直到条件表达式被判断为 false。
请注意,与 if 语句一样,在有条件执行的主体中的每个语句都以分号结尾,但在括号中的条件表达式后面没有分号,这是因为 while 循环不完整,后面没有跟随的语句。而且,与 if 语句一样,当循环体包含两个或多个语句时,这些语句必须用大括号括起来。当循环的主体只包含一个语句时,可以省略括号。
基本上,while 循环就像是一个可以执行一遍又一遍的 if 语句。只要括号中的表达式为 true,则有条件执行的语句将不断重复。
下面的程序使用了 while 循环打印“Hello”字符串 5 次。
#include <iostream>
using namespace std;int main()
{int count = 1;while (count<= 5){cout << "Hello ";count = count + 1;}cout << "\nThat's all!\n";return 0;
}
程序输出结果:
Hello Hello Hello Hello Hello
That's all!
分析这个程序。在第 6 行中,整数变量 count 被定义并用值 1 初始化。在第 7 行中,while 循环以下面的语句开头:
while (count<= 5)
该语句测试变量 count 以确定其值是否小于或等于 5。因为它确实小于 5,所以循环体(第 9 行和第 10 行)中的语句被执行:
cout << "Hello ";
count = count + 1;
第 9 行中的语句将显示字符串“Hello”。第 10 行中的语句则给变量 count 加上 1,使其值变成了 2。这是循环体中的最后一个语句,因此在执行之后循环又一次开始。它再次测试表达式“count<=5”,并且由于仍然为 true,循环体中的语句将再次执行,该循环不断重复,直到变量 count 等于 6,使表达式“count<=5”为 false,然后退出循环,如图 2 所示。

图 2 while 循环工作原理
循环的每一次执行称为迭代。以上示例中的循环将执行 5 次迭代,直至表达式“count<=5”被测试并且发现为 false,导致循环终止,然后程序继续执行该循环之后的语句。控制循环迭代次数的变量称为循环控制变量,在上面的例子中,count 就是循环控制变量。
while 是一个预测试循环
while 循环是一个预测试循环。这意味着它会在每次迭代之前测试其状态。如果测试表达式为 false,则循环将永远不会迭代。如果要确保一个 while 循环至少执行一次,则必须初始化相关的数据,使测试表达式一开始即为 true。
例如,注意上面程序中变量 count 的定义:
int count = 1;
count 变量被初始化为值 1。如果数字已经被初始化为大于 5 的值,则循环将永远不会执行,如下面的程序段所示:
int count = 6;
while (count <= 5)
{cout << "Hello ";count = count + 1;
}
无限循环
除极少数情况外,循环必须包括一种终止方式。这意味着循环中的某些内容必须最终使测试表达式为 false。在上面程序中,当表达式“count <= 5”变为 false 时,循环停止。
如果循环没有停止的方式,则称为无限循环。无限循环将持续重复,直到程序中断,示例如下:
int count = 1;
while (count<= 5)
{cout << "Hello ";
}
这是一个无限循环,因为它不包含更改 count 变量值的语句。每次测试表达式“count <= 5”时,count 的值都是 1。
小心分号
通过在 while 循环的第一行之后意外地放置一个分号也可以创建无限循环,示例如下:
int count = 1;
while (count <= 5) ; //该分号是一个错误
{cout << "Hello ";count = count + 1;
}
因为编译器在发现开始语句块的大括号之前看见了第一行末尾的分号,所以它会在分号的位置结束循环。尤其是它会将分号前面丢失的语句解释为空语句,也就是什么都不做的语句,然后将 while 语句和它后面的任何内容断开。
对于编译器来说,整个循环看起来就像下面这样:
while(count<= 5);
这个 while 循环将持续执行空语句,当然它永远不会执行任何操作。该程序似乎“陷入迷惘”,因为没有任何屏幕输出,也不会显示任何活动。
不要忘记大括号
在编写循环语句时,如果有条件执行的语句是一个语句块,则不要忘记将所有的语句都包含在一组大括号中。如果大括号意外被忽略,则 while 语句有条件执行的仅仅是下一个语句,请看下面的代码示例:
int count = 1;
//该循环忘记使用大括号
while (count <= 5)cout << "Hello ";count = count + 1;
在这段代码中,只有一个语句,也就是 cout 语句,是在 while 循环的主体中。给变量 count 加 1 的语句不在循环体内,所以 count 的值保持为 1,循环测试条件永远为 true。循环将一遍又一遍地打印“Hello”字符串,直到用户停止程序。
不要混清 == 与 =
循环的另一个常见陷阱是,在打算使用 == 运算符时,却意外地使用了 = 运算符。例如,以下示例就是一个无限循环,因为作为循环条件的测试表达式每次都给 remainder 赋值为 1,而不是测试 remainder 是否等于 1:
while (remainder = 1) //错误:条件表达式为赋值语句
{cout << "Enter a number: ";cin >> num;remainder = num % 2;
}
请记住,任何非零值都将被判断为 true。
do-while 循环
除了 while 循环之外,C++ 还提供了 do-while 循环。do-while 循环看起来类似于把一个 while 循环倒过来。图 3 显示了其格式和流程图,右侧流程图直观地描绘了其工作原理。

图 3 do-while-循环的语句结构及流程图
与 while 循环一样,如果循环体中只有一个有条件执行的语句,则可以省略大括号。注意,do-while 循环必须在测试表达式的右括号后用分号终止。
除了外观形式,do-while 循环和 while 循环之间的区别是 do-while 是一个后测试循环,这意味着在循环结束时,也就是在每次迭代完成后,才测试其表达式。因此,即使测试表达式在开始时为 false,do-while 也至少要执行一次迭代。
例如,在以下 while 循环中,cout 语句根本不会执行:
int x = 1;
while (x < 0)cout << x << endl;
但是在以下 do-while 循环中的 cout 语句将执行一次,因为 do-while 循环在迭代结束之前不会判断表达式 x<0:
int x = 1;
docout << x << endl;
while (x < 0);
如果要确保循环执行至少一次,则应使用 do-while 循环。
拜拜~
相关文章:
C/C++之while(do-while)详细讲解
目录 while循环有两个重要组成部分: while 是一个预测试循环 无限循环 do-while 循环 while循环有两个重要组成部分: 进行 true 值或 false 值判断的表达式;只要表达式为 true 就重复执行的语句或块;图 1 显示了 while 循环的…...
SpringCloud学习笔记(一)认识微服务
一、微服务技术栈 二、单体架构和分布式架构的区别 1、单体架构: 将业务的所有功能集中在一个项目中开发,打成一个包进行部署 优点:架构简单,部署成本低缺点:耦合度高 2、分布式架构: 根据业务功能对系统…...
Unity中使用WebSocket (ws://)的方法
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 WebSocket与http 其…...
米哈游春招算法岗-2023.03.19-第一题-交换字符-简单题
交换字符Problem Description 米小游拿到了一个仅由小写字母组成的字符串,她准备进行恰好一次操作:交换两个相邻字母,在操作结束后使得字符串的字典序尽可能大。 请你输出最终生成的字符串。 input 一个仅由小写字母组成的字符串,…...
能把爬虫讲的这么透彻的,没有20年功夫还真不行【0基础也能看懂】
前言 可以说很多人学编程,不玩点爬虫确实少了很多意思,不管是业余、接私活还是职业爬虫,爬虫世界确实挺精彩的。 今天来给大家浅谈一下爬虫,目的是让准备学爬虫或者刚开始起步的小伙伴们,对爬虫有一个更深更全的认知…...
springcloud学习总结
springcloud 构建微服务项目步骤 导入依赖编写配置文件开启这个功能 Enablexxx配置类 于2023年2月24日下午17点38分开始学习于2023年3月17日晚上20点26分学完总结代码地址:https://gitee.com/liang-weihao/StudySpringcloud学习笔记地址:https://www.…...
2022年亏损超10亿,告别野蛮成长的众安在线急需新“引擎”
2023年3月21日,众安在线披露了2022年财报,营收233.52亿元,同比增长6.44%;净亏损16.33亿元,去年同期净利润为11.6亿元,同比由盈转亏。 尽管众安在线再次身陷亏损的泥潭,但投资者却没有选择逃离。…...
ChatGPT文心一言逻辑大比拼(一)
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...
【机器学习面试总结】————特征工程
【机器学习面试总结】————特征工程一、特征归一化为什么需要对数值类型的特征做归一化?二、类别型特征在对数据进行预处理时,应该怎样处理类别型特征?三、高维组合特征的处理什么是组合特征?如何处理高维组合特征?四、组合特征怎样有效地找到组合特征?五、文本表示模型…...
如何将字符串反转?
参考答案 使用 StringBuilder 或 StringBuffer 的 reverse 方法,本质都调用了它们的父类 AbstractStringBuilder 的 reverse 方法实现。(JDK1.8)不考虑字符串中的字符是否是 Unicode 编码,自己实现。递归1. public AbstractStrin…...
Linux内核IO基础知识与概念
什么是 IO在计算机操作系统中,所谓的I/O就是 输入(Input)和输出(Output),也可以理解为读(Read)和写(Write),针对不同的对象,I/O模式可以划分为磁盘…...
paper文献和科研小工具
一、好用的网站 Aminer 二、好用的工具 1. SciSpace SciSpace官网 【ChatGPT 论文阅读神器】SciSpace 用户注册与实战测试 SciSpace是一款基于 ChatGPT 的论文阅读神器。 2. ReadPaper 强大且超实用的论文阅读工具——ReadPaper ReadPaper官网 ReadPaper下载链接 Rea…...
dfs和bfs能解决的问题
一.理解暴力穷举之dfs和bfs暴力穷举暴力穷举是在解决问题中最常用的手段,而dfs和bfs算法则是这个手段的两个非常重要的工具。其实,最简单的穷举法是直接遍历,如数列求和,遍历一个数组即可求得所问答案,这与我在前两篇博…...
静态通讯录,适合初学者的手把手一条龙讲解
数据结构的顺序表和链表是一个比较困难的点,初见会让我们觉得有点困难,正巧C语言中有一个类似于顺序表和链表的小程序——通讯录。我们今天就来讲一讲通讯录的实现,也有利于之后顺序表和链表的学习。 目录 0.通讯录的初始化 1.菜单的创建…...
【你不知道的 CSS】你写的 CSS 太过冗余,以至于我对它下手了
:is() 你是否曾经写过下方这样冗余的CSS选择器: .active a, .active button, .active label {color: steelblue; }其实上面这段代码可以这样写: .active :is(a, button, label) {color: steelblue; }看~是不是简洁了很多! 是的,你可以使用…...
Lesson 8.1 决策树的核心思想与建模流程
文章目录一、借助逻辑回归构建决策树1. 决策树实例2. 决策树知识补充2.1 决策树简单构建2.2 决策树的分类过程2.3 决策树模型本质2.4 决策树的树生长过程2.5 树模型的基本结构二、决策树的分类与流派1. ID3(Iterative Dichotomiser 3) 、C4.5、C5.0 决策树2. CART 决策树3. CHA…...
【算法】FIFO先来先淘汰算法分析和编码实战
背景 在设计一个系统的时候,由于数据库的读取速度远小于内存的读取速度 为加快读取速度,将一部分数据放到内存中称为缓存,但内存容量是有限的,当要缓存的数据超出容量,就需要删除部分数据 这时候需要设计一种淘汰机制…...
二分查找——我欲修仙(功法篇)
个人主页:【😊个人主页】 系列专栏:【❤️我欲修仙】 学习名言:临渊羡鱼,不如退而结网——《汉书董仲舒传》 系列文章目录 第一章 ❤️ 二分查找 文章目录系列文章目录前言🚗🚗🚗二分查找&…...
Python 多线程
文章目录一、简介1.1 多线程的特性1.2 GIL二、线程1.2 单线程1.3 多线程三、线程池3.1 pool.submit3.2 pool.map四、Lock(线程锁)4.1 无锁导致的线程资源异常4.2 有锁五、Event(事件)5.1 简介5.2 示例六、Queue(队列&a…...
JVM笔记(九)选择合适的垃圾收集器
Epsilon收集器Epsilon收集器由RedHat公司在JEP 318中提出,在此提案里Epsilon被形容成一个无操作的收集器(A No-Op Garbage Collector),而事实上只要Java虚拟机能够工作,垃圾收集器便不可能是真正“无操作”的。原因是“…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
