5.4 迭代语句

news2025/1/18 16:51:15

文章目录

    • while语句
      • 使用while循环
    • 传统for语句
      • 传统for循环的执行过程
      • for语句头中的多重定义
      • 省略for语句头的某些部分
    • 范围for语句
    • do while语句

迭代语句通常称为循环,它重复执行操作直到满足某个条件才停下来。while和for语句在执行循环体之前检查条件,do while 语句先执行循环体,然后再检查条件。

while语句

基本语法:

while(condition)
statement

在while结构中,只要condition的求值结果为真就一直执行statement (常常是一一个块)。condition不能为空,如果condition第一次求值就得 false, statement 一次都不执行。while的条件部分可以是一个表达式或者是一个带初始化的变量声明。通常来说,应该由条件本身或者是循环体设法改变表达式的值,否则循环可能无法终止。

PS:定义在while条件部分或者while循环体内的变量每次迭代都经历从创建到销毁的过程。

使用while循环

当不确定到底要迭代多少次时,使用while循环比较合适,比如读取输入的内容就是如此。还有一种情况也应该使用while循环,这就是我们想在循环结束后访问循环控制变量。

样例:下面将演示使用循环内变量以及利用while无限输入数据的操作。(此段程序所做的就是统计连续出现的字符串次数,并输出最大的)

#include<iostream>
#include<vector>
#include<string>

using namespace std;

int main()
{
	vector<string> str;
	string p;
	int num1=1, num2=1;
	while (cin>>p)
	{
		str.push_back(p);
	}
	auto pbeg = str.begin();
	p = *pbeg;
	while (++pbeg!=str.end())
	{
		if (*pbeg==*(pbeg-1))
		{
			num2 += 1;
		}
		else
		{
			num2 = 1;
		}
		if (num2>=num1)
		{
			p = *pbeg;
			num1 = num2;
		}
	}
	if (num1>1)
	{
		cout << p << "连续出现了" << num1 << "次" << endl;
	}
	else
	{
		cout << "没有连续出现的字符串" << endl;
	}
	return 0;
}

输出结果:
在这里插入图片描述

传统for语句

传统for循环的语法是:

for(ini-statement;condition;expression)
statement

一般情况下,init-statement负责初始化一个值,这个值将随着循环的进行而改变。condition作为循环控制的条件,只要condition 为真,就执行一次 statement。如果condition第一次的求值结果就是false, 则statement 一次也不会执行。expression 负责修改init-statement初始化的变量,这个变量正好就是condition检查的对象,修改发生在每次循环迭代之后。statement 可以是一条单独的语句也可以是一条复合语句。

传统for循环的执行过程

这里用一个以前常用的例子(小写字母改成大写字母为例):

#include<iostream>
#include<string>
#include<cctype>
using namespace std;

int main()
{
	string str = "helloworld";
	for (decltype(str.size()) i = 0; i != str.size() && !isspace(str[i]); i++)
		str[i] = toupper(str[i]);
	cout << str;
	return 0;
}

求值的顺序如下所示:

  1. 循环开始时,首先执行一 次init-statement。 此例中,定义i并初始化为0。
  2. 接下来判断condition。如果i不等于str.size()而且在str[i]位置的字符不是空白,则执行for循环体的内容。否则,循环终止。如果第一次迭代时条件就为假,for 循环体一次也不会执行。
  3. 如果条件为真,执行循环体。此例中,for 循环体将str [i]位置的字符改写成大写形式。
  4. 最后执行expression。此例中,将i的值加1。

这4步说明了for循环第一次迭代的过程。其中第1步只在循环开始时执行一次,第2、3、4步重复执行直到条件为假时终止,也就是在str中遇到一一个空白字符或者i 大于str.size()时终止。

PS:值得注意的是,for语句头定义的变量的生存周期仅在for循环内部可见,出了for循环后,除非是定义在外部的变量,进入for循环进行改变,生存周期才在外面。

for语句头中的多重定义

和其他的声明一样,init-statement 也可以定义多个对象。但是init-statement只能有一条声明语句,因此,所有变量的基础类型必须相同。即在ini-statement当中仅能int i=0,j=0.不能存在完整的语句,不然就需要分号。

省略for语句头的某些部分

for语句头能省略掉init-statement、condition和expression中的任何一个(或者全部)。如果无须初始化,则我们可以使用一条空语句作为init-statement。但是分号必须保留,以证明我们省略了,而非忘记填了。

省略condition的效果等价于在条件部分写了一个true.因为条件的值永远是true,所以在循环体内必须有语句负责退出循环,否则循环就会无休止地执行下去。

我们也能省略掉for语句头中的expression,但是在这样的循环中就要求条件部分或者循环体必须改变迭代变量的值。这样子才能跳出循环。

最后以一段代码进行收尾,大家理解一下这段代码。

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int>num1 = { 0,1,1,2 };
	vector<int>num2 = { 0,1,1,2,3,5,8 };
	//题目我们要判断num1和num2之间是否有一个是另一个的前缀。
	bool tag = true;
	for (decltype(num1.size()) beg1 = 0,beg2= 0; beg1 != num1.size() && beg2 != num2.size() ; beg1++,beg2++)
	{
		if (num1[beg1]!=num2[beg2])
		{
			tag = false;
			break;
		}
	}
	if (tag)
	{
		cout << "是" << endl;
	}
	else
	{
		cout << "不是" << endl;
	}
	return 0;
}

输出结果:
在这里插入图片描述

范围for语句

C++11中引入了一个新的for循环,范围for来遍历容器或者其他的序列的所有元素。

语法:

for(declaration : expression)
statement

expression表示的必须是一个序列,比如用花括号括起来的初始值列表 、数组或者vector或string等类型的对象,这些类型的共同特点是拥有能返回迭代器的begin和end成员。

declaration定义一个变量,序列中的每个元素都得能转换成该变量的类型。确保类型相容最简单的办法是使用auto类型说明符,这个关键字可以令编译器帮助我们指定合适的类型。如果需要对序列中的元素执行写操作,循环变量必须声明成引用类型。

每次迭代都会重新定义循环控制变量,并将其初始化成序列中的下一个值,之后才会执行statement。像往常一样, statement 可以是一条单独的语句也可以是一一个块。所有元素都处理完毕后循环终止。

这边给一个例子:

#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> num1 = { 0,1,2,3,4,5 };
	for (auto& i:num1 )
	{
		i *= 2;
	}
	for (auto i:num1)
	{
		cout << i << " ";
	}
	return 0;
}

输出结果:
在这里插入图片描述

do while语句

do while语句和while语句非常相似,唯一的区别 是,do while语句先执行循环体后检查条件。不管条件的值如何,都至少执行一次循环。do while语句的语法形式如下所示:

do
statement
while(condition);

PS:do-while语句应该在最后面的括号处加上一个分号。

但值得注意的是,它和while最大的区别就是他会先不管condition,会先执行一次。所以,我们平时可能会在while当中定义变量,或者接收cin的输入流,对于do-while就明显使用不了了,除非你想使用进行特殊的功能。

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

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

相关文章

MATLAB算法实战应用案例精讲-【连接分析】PageRank(补充篇)(附Python代码实现)

前言 PageRank算法在1998年4月举行的第七届国际万维网大会上由Sergey Brin和Larry Page提出。PageRank是通过计算页面链接的数量和质量来确定网站重要性的粗略估计。算法创立之初的目的是应用在Google的搜索引擎中,对网站进行排名。 随着国内外学者的深入研究,PageRank算法…

burpsuite靶场——SSRF

文章目录针对本地服务器的基本 SSRF针对另一个后端系统的基本 SSRFSSRF 与基于黑名单的输入过滤器基于白名单的输入过滤器的 SSRFSSRF 通过开放重定向漏洞绕过过滤器带外检测的盲 SSRF利用 Shellshock 的盲 SSRF针对本地服务器的基本 SSRF 在商品下查看货物库存情况时抓包 有st…

操作系统实验2:fork()系统调用

操作系统实验2:fork()系统调用 文章目录操作系统实验2:fork()系统调用Task1: fork的基本使用代码运行结果解释Task2: 深入理解fork创建的子进程与父进程的关系代码实验结果现象解释遇到的问题1.乌龙事件 vscode2.the troubles encountered in task1如何跑.sh文件编译链接遇到的…

SegeX Progress:MFC通用进度条

----哆啦刘小洋 原创&#xff0c;转载需说明出处 MFC高级通用进度条-目录1 简介2 进度条实现基本原理3 使用方法3 .1 简单情况3.2 两个前后独立的进度条3.3 实际应用的一般情况3.4 带子进度条4 其他4.1 使用限制4.2 其他全局宏&#xff08;函数&#xff09;4.3 当前进度条设置1…

技术开发107

技术开发107 业务内容&#xff1a; 汽车音响等汽车电子部件试制、电子设备部件试制、精密钣金试制精密钣金试制 公司简介&#xff1a; 代表&#xff1a;中山尚美 成立时间&#xff1a;1950年6月 资本金&#xff1a;1000万日元 员工数&#xff1a;15名 资格认证&#xff…

数智为线,经纬中国:新华三勾勒出的山河锦绣

刺绣&#xff0c;是中华民族源远流长的技艺美术。早在《尚书》中&#xff0c;就记载了章服制度“衣画而裳绣”。而刺绣之美之所以能够传承千年&#xff0c;形成中国审美的一张名片&#xff0c;就是因为传统的染色技艺不够精细&#xff0c;颜色常常浮在布匹表面&#xff0c;但刺…

【卫朋】营销技能:营销4P之外,还有这些经典理论

一提到市场营销&#xff0c;很多人都可能会联想到经典的营销4P理论&#xff0c;但你可能不知道的是&#xff0c;4P理论只是“4字营销理论家族”中的一员。 市场营销“4字家族”中的4P、4R、4C理论构成了市场营销的基础部分。 它们诞生于特殊的环境和年代&#xff0c;为当时的企…

Redis原理篇—内存回收

Redis原理篇—内存回收 笔记整理自 b站_黑马程序员Redis入门到实战教程 内存过期策略-过期key处理 Redis 之所以性能强&#xff0c;最主要的原因就是基于内存存储。然而单节点的 Redis 其内存大小不宜过大&#xff0c;会影响持久化或主从同步性能。 我们可以通过修改配置文件…

再学C语言16:表达式和语句

语句组成了C的基本程序的步骤&#xff0c;大多数语句由表达式构造而成 一、表达式 表达式&#xff08;expression&#xff09;由运算符和操作数组合构成 操作数是运算符操作的对象&#xff0c;可以是常量、变量或二者的组合 C的一个重要属性&#xff1a;每一个C表达式都有一…

Python 基础教程(1)——翻转字符串、集合运算、字符串、列表、元组、字典、数据类型转换、Python推导式、Python运算符、Python 数字类型转换、字符串

1.翻转字符串 def reverseWords(input):# 通过空格将字符串分隔符&#xff0c;把各个单词分隔为列表inputWords input.split(" ")# 翻转字符串# 假设列表 list [1,2,3,4], # list[0]1, list[1]2 &#xff0c;而 -1 表示最后一个元素 list[-1]4 ( 与 list[3]4 一样…

【C++进阶】特殊类设计

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

vue书写一个uni-app小程序

在本次文章中我来大致向大家介绍一下如何使用Hbuilder X来编写一个uni-app的小程序的项目&#xff0c;在此我只说编写的方法与方向&#xff0c;具体的操作留给大家去亲自实操哦。 1.起步&#xff08;创建一个uni-app框架&#xff09;&#xff1a; 首先&#xff0c;我们需要把…

低代码破解了软件开发“不可能三角”?我做了个测评...

老读者知道&#xff0c;K哥写了10几年代码&#xff0c;后来转做技术管理&#xff0c;现在是上市公司的技术高管。在我们软件行业有一条铁律&#xff1a;长周期、大规模的软件研发过程当中&#xff0c;想要维持良好的运作&#xff0c;需要解决&#xff1a;成本、效能、质量。而且…

Doris-查询(三)

目录1、查询设置1.1、增大内存1.2、修改超时时间1.3、查询重试和高可用1.3.1 代码方式1.3.2 JDBC Connector1.3.3 ProxySQL 方式2、简单查询3、Join查询3.1 Broadcast Join3.2 Shuffle Join&#xff08;Partitioned Join&#xff09;3.3 Colocation Join3.3.1 原理3.3.2 使用3.…

数字孪生电力3D可视化管控平台

当前&#xff0c;新一轮科技革命和产业变革加速演进&#xff0c;物联网、大数据、云计算、人工智能、5G等新一代信息技术快速发展。在众多技术手段中&#xff0c;数字孪生技术以虚实结合为主&#xff0c;架起虚拟世界与现实世界之间沟通的桥梁&#xff0c;为人们提供了更加便捷…

分享5款可以录屏的软件,录屏幕视频软件,亲测好用

很多小伙伴都会使用电脑来作为自己办公、娱乐、学习生活的工具。在电脑上安装录屏软件&#xff0c;可以轻松的协助我们进行网课录制、会议录制、影剧片段录制等。网络上的录屏软件有很多&#xff0c;今天小编分享5款亲测好用的录屏软件&#xff0c;一起来看看吧。 可以录屏的软…

数据结构进阶 二叉搜索树

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍二叉搜索树并且模拟实现之 二叉搜索树二叉搜索树的概念节点类二叉搜索树类私有成员构造函数拷贝构造函数赋值运算符重载函数…

若想学 HTML,应从何入手?

前言 个人信息&#xff1a; 大三 工商管理 逻辑算清晰 无编程基础 想学网页设计&#xff0c;打算从HTML开始 。 下面是问题&#xff1a; 需要先学一些更基础的语言&#xff08;如C之类的&#xff09;吗&#xff1f;有何建议&#xff1a; &#xff08;1&#xff09;看哪些书、泡…

无忧·企业邮筒功能介绍

应用介绍 企业邮筒&#xff0c;基于B/S模式的邮件客户端&#xff0c;采用JVS的统一用户体系&#xff0c;作为JVS的协同办公的应用之一。 产品特点 私有化部署、支持多邮件账户、将多个邮件客户端统一为web操作、 软件架构 软件架构说明&#xff0c;JVS-mailbox是作为JVS基…

服装实体店运营需要的所有软件,合集在此!(建议收藏)实体店运营 实体店运营干货 实体店运营全流程所需系统推荐

随着信息化普及程度越来越高&#xff0c;各行各业的运转速度都在加快&#xff0c;做生意的老板们也开始发现&#xff0c;单靠以前的人工管理已经完全不够用了。 尤其是服装实体店&#xff0c;款式分类多&#xff0c;库存又容易挤压&#xff0c;更加需要有科学的手段去管控日常的…