C++初学(13)
13.1、for循环的组成部分
for循环的组成部分完成下面这些步骤:
(1)设置初始值。
(2)执行测试,看看循环是否应当继续。
(3)执行循环操作。
(4)更新用于测试的值。
C++循环设计中包含这要素,很容易识别,初始化、测试和更新操作工程量控制部分,这些操作由括号括起。其中每部分都是一个表达式,彼此由分号隔开。控制部分后面的语句叫作循环体,只要测试表达式为true,它便被执行:
for(initialization;text-expression;update-expression)body
循环只执行一次初始化。通常,程序使用该表达式将变量设置为初始值,然后用该变量计算循环周期。
text-expression(测试表达式)决定循环体是否被执行。通常这个表达式是关系表达式,即对两个值进行比较。例如:i<=6。i与6进行比较,看i是否小于或等于6,如果比较结果为真,程序将执行循环体。实际上,C++并没有将text-expression的值限定为只能真或假,可以使用任意表达式,C++将把结果强制转换为bool类型。因此值为0的表达式将被转换为bool值false,导致循环结束。反之则会让循环继续进行。
#include <iostream>
int main()
{using namespace std;cout << "Enter the starting countdown valus: ";int limit;cin >> limit;int i;for (i = limit; i; i--)cout << "i= " << i << endl;cout << "Done now that i= " << i << endl;return 0;
}

for循环是入口条件循环,这意味着在每轮循环之前,都将计算测试表达式得知,当测试表达式为false时,将不会执行循环体。例如上面程序,我输入0时,将不会运行循环体。
update-expression(更新表达式)在每轮循环结束时执行,此时循环体已经执行完毕。通常,它用来对跟踪循环轮次的变量的值进行增减,然而它可以是任何有效的C++表达式,还可以是其他控制表达式。
for语句看上去有些像函数调用,因为它使用一个后面跟一对括号的名称。然而for是一个C++关键字,因此编译器不会将for视为一个函数。
13.2、回到for循环
下面使用for循环完成更多的任务,例如计算前16个阶乘:
#include <iostream>
const int ArSize = 16;
int main()
{using namespace std;long long factorials[ArSize];factorials[1] = factorials[0] = 1LL;for (int i = 2; i < ArSize; i++){factorials[i] = i * factorials[i - 1];}for (int i = 0; i < ArSize; i++){cout << i << "!= " << factorials[i] << endl;}return 0;
}

该程序创建了一个数组来存储阶乘值。元素0存储0!,元素1存储1!,依次类推。由于前两个阶乘都等于1,因此将该数组的前两个元素设置为1。第一个for语句用循环将每个阶乘设置为索引号与前一个阶乘的乘积。
13.3、修改步长
我们到目前为止循环演示都是循环计数加一或减一,其实可以通过修改更新表达式来修改补偿。
下面程序没有将i++用于更新表达式,而是使用表达式i+=by,by是用户输入的步长。
#include <iostream>
int main()
{using namespace std;cout << "Enter an integer: ";int by;cin >> by;cout << "Counting by " << by << "s:" << endl;for (int i = 0; i < 100; i += by)cout << i << endl;return 0;
}

当96+16=112>100,循环终止。
13.4、使用for循环访问字符串
for循环提供了一种依次访问字符串中每个字符串的方式。例如下面这个程序,让用户能够输入一个字符串,然后按相反的方向逐个字符地显示该字符串。
#include <iostream>
#include <string>
int main()
{using namespace std;cout << "Enter a word: ";string word;cin>>word;for (int i = word.size() - 1; i >= 0; i--)cout << word[i];cout << "\nBye.\n";return 0;
}

在这个程序中,可以使用string对象,也可以使用char数组,因为它们都让我们能够使用数组表示法来访问字符串中的字符。string类的size()获得字符串中的字符数;循环在其初始化表达式中使用这个值,将i设置为字符串最后一个字符的索引。为了反向计数,程序使用递减运算符(--)。
13.5、递增运算符(++)和递减运算符(--)
递增运算符和递减运算符是很常见的操作:将循环计数加一或减一。但是有两种变体,前置++/--x和后置x++/--。这两种对结果的影响是一致的,但是对于运行的时间是不同的。
前置++/--是修改后使用,而后置++/--是使用后修改,例如上面程序的i--,是让循环语句的主体运行完一起才进行减一。
13.6、复合语句
前面我们的for语句都只写了一句,如果我们要运行多条语句,那不是很麻烦吗,其实我们只要用两个花括号来构造一条复合语句。
#include <iostream>
int main()
{using namespace std;cout << "The Amazing Accounto will sum and average ";cout << "five numbers for you." << endl;cout << "Please enter five values: " << endl;double number;double sum = 0;for (int i = 1; i <= 5; i++){cout << "Value " << i << " : ";cin >> number;sum += number;}cout << "Five exquistite choices inded! ";cout << "They sum to " << sum << endl;cout << "and average to " << sum / 5 << "." << endl;cout << "The Amazing Accounto bids you adieu!";return 0;
}

13.7、其他语法技巧——逗号运算符
语句块允许把两条或更多条语句放到按C++句法只能放一条语句的地方。逗号运算符对表达式完成同样的工作,允许将两个表达式放到C++句法只允许放一个表达式的地方。假设有一个循环,每轮让一个变量加一,另一个变量减一,在for循环控制部分的更新部分中完成这两项工作将非常方便。
#include <iostream>
#include <string>
int main()
{using namespace std;cout << "Enter a word:";string word;cin >> word;char temp;int i, j;for (j = 0, i = word.size() - 1; j < i; i--, j++){temp = word[i];word[i] = word[j];word[j] = temp;}cout << word << "\nDone." << endl;return 0;
}

在循环体中,程序将数组第一个元素和最后一个元素调换,从而将单词反转过来。然后再将j加一,i减一,让它们分别指向第2个元素和倒数第2个元素调换。直到j>=i循环才停止。
13.8、关系表达式

13.9、比较string类字符串
#include <iostream>
#include <string>
int main()
{using namespace std;string word = "?urina";for (char ch = 'a'; word != "furina"; ch++){cout << word << endl;word[0] = ch;}cout << "After loop ends,word is " << word << endl;return 0;}

上面程序使用了一个关系运算符,该运算符左边的是一个string对象,右边是一个C风格字符串:
string word = "?urina";
string类重载运算符!=的方式让你能够在下述的条件下使用它:至少一个操作数为string对象,另一个可以是string对象,或者C风格字符串。
该for循环不是计数循环,而是根据情况(word是否为furina)来确定是否停止。

相关文章:
C++初学(13)
13.1、for循环的组成部分 for循环的组成部分完成下面这些步骤: (1)设置初始值。 (2)执行测试,看看循环是否应当继续。 (3)执行循环操作。 (4)更新用于测试的值。 C循环设计中包含这要素,很容易识别,初始化、测试和更新操作工…...
目标检测之数据增强
一、概述 数据增强是一种通过人工或自动方式对数据进行修改或变换,以增加数据集规模和多样性的技术。在机器学习中,数据增强被广泛应用于解决数据稀缺、数据不平衡、数据噪声等问题,提高模型的泛化能力和鲁棒性。 二、为什么需要数据增强 …...
本地下载安装WampServer结合内网穿透配置公网地址远程访问详细教程
文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境,是一组常用来…...
一篇文章理清Java持久化脉络(关于JDBC、JPA、Hibernate、Spring Data JPA)
Java持久化 一、JDBC、JPA、Spring Data JPA 的定义及关系二、JDBC(古老的东西,只需简单知道是啥)1.1 JDBC概念1.2 JDBC示例 三、JPA(第二代持久化,代表是Hibernate等框架)3.1 JPA概念3.2 JPA示例 四、Spri…...
【数学分析笔记】第2章第1节实数系的连续性(1)
2. 数列极限 2.1 实数系的连续性 人类对数系认识的历史: 人类最早对数系的认识是自然数集合 N \mathbb{N} N,自然数系对加法和乘法是封闭的(这里的封闭是指:若 m ∈ N , n ∈ N ⇒ m n ∈ N , m n ∈ N m\in\mathbb{N},n\in\ma…...
Speech Synthesis (LASC11062)
大纲 Module 1 – introductionModule 2 - unit selectionModule 3 - unit selection target cost functionsModule 4 - the databaseModule 5 - evaluationModule 6 - speech signal analysis & modellingModule 7 - Statistical Parametric Speech Synthesis (SPSS)Modu…...
拟合与插值|线性最小二乘拟合|非线性最小二乘拟合|一维插值|二维插值
挖掘数据背后的规律是数学建模的重要任务,拟合与插值是常用的分析方法 掌握拟合与插值的基本概念和方法熟悉Matlab相关程序实现能够从数据中挖掘数学规律 拟合问题的基本提法 拟合问题的概念 已知一组数据(以二维为例),即平面上n个点 ( x i , y i ) …...
《python语言程序设计》2018版第7章第05题几何:正n边形,一个正n边形的边都有同样的长度。角度同样 设计RegularPolygon类
结果和代码 这里只涉及一个办法 方法部分 def main():rX, rY eval(input("Enter regular polygon x and y axis:"))regular_num eval(input("Enter regular number: "))side_long eval(input("Enter side number: "))a exCode07.RegularPol…...
使用Virtio Driver实现一个计算阶乘的小程序——QEMU平台
目录 一、概述 二、代码部分 1、Virtio 前端 (1) User Space (2) Kernel Space 2、Virtio 后端 三、运行 QEMU Version:qemu-7.2.0 Linux Version:linux-5.4.239 一、概述 本篇文章的主要内容是使用Virtio前后端数据传输的机制实现一个计算阶乘的…...
【PyCharm】配置“清华镜像”地址
文章目录 前言一、清华镜像是什么?二、pip是什么?三、具体步骤1.复制镜像地址2.打开PyCharm,然后点击下图红框的选项3.在弹出的新窗口点击下图红框的选项进行添加4.在URL输入框中粘贴第一步复制的地址,名字可以不更改,…...
IO器件性能评估
整体逻辑:需要先了解到读写速率的差异,在明确使用场景。比如应用启动过程中的IO主要是属于随机读的io 评估逻辑: UFS 与 eMMC主要差别在io读写能力: 1,对比UFS、eMMC的规格书标注的io读写能力 ufs spec : sequentia…...
在js中判断对象是空对象的几种方法
使用 Object.keys() 方法 Object.keys() 方法返回对象自身的可枚举属性名称组成的数组。如果数组的长度为 0,那么对象是空的。 function isEmptyObject(obj) {return Object.keys(obj).length 0 && obj.constructor Object; }const obj1 {}; const obj2…...
【整理】后端接口设计和优化相关思路汇总
文章目录 明确的接口定义和文档化使用RESTful设计规范分页和过滤合理使用缓存限流与熔断机制安全性设计异步处理与后台任务接口参数校验(入参和出参)接口扩展性考虑核心接口,线程池隔离关键接口,日志打印接口功能单一性原则接口查…...
docker 部署 sql server
众所周知,sql server不好装,本人之前装了两次,这个数据库简直是恶心。 突然想到,用docker容器吧 果然可以 记得放开1433端口 还有 记得docker加速,不然拉不到镜像的最后工具还是要装的,这个就自己研究吧。 …...
微信云开发云存储 下载全部文件
一、安装 首先按照这个按照好依赖,打开cmd 安装 | 云开发 CloudBase - 一站式后端云服务 npm i -g cloudbase/cli 安装可能遇到的问题 ‘tcb‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。-CSDN博客 二、登录 在cmd输入 tcb login 三、…...
1、巡线功能实现(7路数字循迹)
一、小车运行 1.PWM初始化函数 (pwm.c中编写) 包括四个轮子PWM通道使用的GPIO接口初始化、定时器初始化、PWM通道初始化。 void PWM_Init(uint16_t arr,uint16_t psc); 2.PWM占空比设置函数 (pwm.c中编写) 此函数调用了四个通道设置占空比的函数,作用是方便修改四…...
来了...腾讯内推的软件测试面试PDF 文档(共107页)
不多说,直接上干货(展示部分以腾讯面试纲要为例)完整版文末领取 通过大数据总结发现,其实软件测试岗的面试都是差不多的。常问的有下面这几块知识点: 全网首发-涵盖16个技术栈 第一部分,测试理论&#x…...
Android大脑--systemserver进程
用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章,技术文章也可以有温度。 本文摘要 系统native进程的文章就先告一段落了,从这篇文章开始写Java层的文章,本文同样延续自述的方式来介绍systemserver进程,通过本文您将…...
python项目部署:Nginx和UWSGI认识
Nginx: HTTP服务器,反向代理,静态资源转发,负载均衡,SSL终端,缓存,高并发处理。 UWSGI: Python应用程序服务器,WSGI兼容,多进程管理,快速应用部署,多种协议支…...
【区块链+金融服务】农业大宗供应链线上融资平台 | FISCO BCOS应用案例
释放数据要素价值,FISCO BCOS 2024 应用案例征集 粮食贸易受季节性影响显著。每年的粮收季节,粮食收储企业会根据下游订单需求,从上游粮食贸易商或粮农手 里大量采购粮食,并分批销售给下游粮食加工企业(面粉厂、饲料厂…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
