4.C++中的循环语句

C++中的循环语句

for 循环

for 循环是一种最常用的循环结构,通常用于已知循环次数的情况。

基本语法:
for (初始化表达式; 条件表达式; 更新表达式) {// 循环体,当条件表达式为真时执行
}

例如:

#include <iostream>
using namespace std;int main() {for (int i = 0; i < 5; i++) {cout << i << " ";}return 0;
}
代码解释:
  • int i = 0:初始化表达式,用于初始化循环变量 i 的值。
  • i < 5:条件表达式,当此表达式为 true 时,循环继续执行。
  • i++:更新表达式,每次循环结束后更新循环变量的值。
范围 for 循环(C++11 引入):

用于遍历容器(如 vectorarray 等)或数组。

#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> v = {1, 2, 3, 4, 5};for (int num : v) {cout << num << " ";}return 0;
}
代码解释:
  • for (int num : v):将 v 中的每个元素依次赋值给 num,并执行循环体。

while 循环

while 循环用于在条件为真时执行循环,适用于不确定循环次数的情况。

基本语法:
while (条件表达式) {// 循环体,当条件表达式为真时执行
}

例如:

#include <iostream>
using namespace std;int main() {int i = 0;while (i < 5) {cout << i << " ";i++;}return 0;
}
代码解释:
  • i < 5:只要 i 小于 5,循环就会继续执行。
  • 循环体内需要手动更新循环变量 i,否则可能导致死循环。

do-while 循环

do-while 循环至少会执行一次,然后根据条件决定是否继续执行。

基本语法:
do {// 循环体
} while (条件表达式);

例如:

#include <iostream>
using namespace std;int main() {int i = 0;do {cout << i << " ";i++;} while (i < 5);return 0;
}
代码解释:
  • 首先执行一次循环体,然后检查 i < 5 的条件,如果为 true,则继续执行循环。

嵌套循环

可以将循环嵌套使用,用于处理二维数组、矩阵等复杂结构。

#include <iostream>
using namespace std;int main() {for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {cout << i << "," << j << " ";}cout << endl;}return 0;
}
代码解释:
  • 外层 for 循环控制行,内层 for 循环控制列,可用于遍历二维数组或打印矩阵。

循环控制语句

1. break 语句:
  • 用于立即终止最内层的循环。
#include <iostream>
using namespace std;int main() {for (int i = 0; i < 10; i++) {if (i == 5) {break;}cout << i << " ";}return 0;
}
2. continue 语句:
  • 用于跳过当前循环的剩余部分,继续下一次循环。
#include <iostream>
using namespace std;int main() {for (int i = 0; i < 5; i++) {if (i == 2) {continue;}cout << i << " ";}return 0;
}

循环的应用场景

1. for 循环:
  • 适合处理已知迭代次数的情况,如遍历数组、计算数列等。
2. while 循环:
  • 适用于条件驱动的循环,例如文件读取,当文件未结束时继续读取。
3. do-while 循环:
  • 适用于需要先执行一次操作,再根据条件判断是否继续的场景,如用户输入验证。

性能考虑

  • 在性能方面,对于已知迭代次数的简单迭代,for 循环通常是最直观的选择。
  • 对于复杂条件的迭代,whiledo-while 可能更适合,可根据具体情况灵活使用。

注意事项

1. 无限循环:
  • 要注意避免无限循环,确保循环条件会在一定情况下变为 false
2. 循环变量更新:
  • whiledo-while 循环中,要记得在循环体内更新循环变量,否则可能导致死循环。

C++ 的循环语句提供了强大的程序控制能力,可以根据不同的场景和需求选择合适的循环结构,配合循环控制语句,可以编写出简洁高效的程序。

使用 auto 关键字(C++11 引入)

在范围 for 循环中,可以使用 auto 关键字自动推导元素类型。

#include <iostream>
#include <vector>
using namespace std;int main() {vector<string> v = {"hello", "world", "cpp"};for (auto str : v) {cout << str << " ";}return 0;
}

代码解释:

  • for (auto str : v):根据 v 中的元素类型自动推导 str 的类型,简化代码编写。

循环语句是 C++ 程序控制流的重要组成部分,通过合理使用不同的循环语句和控制语句,可以实现各种复杂的逻辑和算法。

拓展知识:

一、基于范围的 for 循环(Range-based for loop)的更多细节
1. 遍历自定义容器

对于自定义的容器,只要容器提供了 begin()end() 成员函数,返回迭代器,就可以使用范围 for 循环。

#include <iostream>
#include <vector>class MyContainer {
public:class Iterator {public:using value_type = int;Iterator(int* ptr) : ptr_(ptr) {}int& operator*() const { return *ptr_; }Iterator& operator++() { ++ptr_; return *this; }bool operator!=(const Iterator& other) const { return ptr_!= other.ptr_; }private:int* ptr_;};MyContainer(int* begin, int* end) : begin_(begin), end_(end) {}Iterator begin() const { return Iterator(begin_); }Iterator end() const { return Iterator(end_); }
private:int* begin_;int* end_;
};int main() {int arr[] = {1, 2, 3, 4, 5};MyContainer container(arr, arr + 5);for (int num : container) {std::cout << num << " ";}return 0;
}
2. 修改容器元素

使用引用可以修改容器元素:

#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> v = {1, 2, 3, 4, 5};for (int& num : v) {num = num * 2;}for (int num : v) {cout << num << " ";}return 0;
}
二、并行 for 循环(C++17 引入)

使用 <execution> 头文件中的 std::for_each 结合执行策略,可以实现并行 for 循环,利用多线程加速处

#include <iostream>
#include <vector>
#include <algorithm>
#include <execution>int main() {std::vector<int> v = {1, 2, 3, 4, 5};std::for_each(std::execution::par, v.begin(), v.end(), [](int& num) {num = num * num;});for (int num : v) {std::cout << num << " ";}return 0;
}
三、迭代器适配器和范围库(C++20 引入)

C++20 引入了范围库,可以更方便地处理范围操作。

1. 使用 std::views::iota 创建范围
#include <iostream>
#include <ranges>int main() {for (int i : std::views::iota(0, 10)) {std::cout << i << " ";}return 0;
}
2. 使用 std::views::filterstd::views::transform 进行过滤和转换
#include <iostream>
#include <vector>
#include <ranges>
#include <algorithm>int main() {std::vector<int> v = {1, 2, 3, 4, 5};auto result = v | std::views::filter([](int i) { return i % 2 == 0; })| std::views::transform([](int i) { return i * i; });for (int num : result) {std::cout << num << " ";}return 0;
}
四、goto 语句(不推荐,但有时有用)

goto 语句可以跳转到程序中的标记位置,但它会使程序结构混乱,通常不推荐使用。

#include <iostream>
using namespace std;int main() {int i = 0;loop:if (i < 5) {cout << i << " ";i++;goto loop;}return 0;
}
五、使用 while(true) 实现无限循环

在某些情况下,可能需要一个无限循环,可以使用 while(true)for(;;) 来实现。

#include <iostream>
using namespace std;int main() {int i = 0;while (true) {if (i >= 5) break;cout << i << " ";i++;}return 0;
}
六、性能优化
  • 循环展开
    手动展开循环可以减少循环控制的开销,但可能会使代码更难维护。
#include <iostream>
using namespace std;int main() {int sum = 0;for (int i = 0; i < 100; i += 5) {sum += i;sum += (i + 1);sum += (i + 2);sum += (i + 3);sum += (i + 4);}cout << sum << endl;return 0;
}
  • 编译器优化
    现代编译器通常会对循环进行优化,如自动向量化、循环展开、强度削减等,可以使用编译器选项(如 -O3)开启更高级的优化。
七、异常处理和循环

在循环中可以使用异常处理机制,例如在文件读取循环中:

#include <iostream>
#include <fstream>
#include <string>
#include <stdexcept>int main() {std::ifstream file("test.txt");if (!file.is_open()) {throw std::runtime_error("Could not open file");}std::string line;while (std::getline(file, line)) {try {// 处理文件内容std::cout << line << std::endl;} catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl;}}return 0;
}
八、递归作为循环的替代

对于一些复杂问题,递归可以作为循环的替代方案,特别是涉及树状结构或分治算法时。

#include <iostream>
using namespace std;int factorial(int n) {if (n == 0) return 1;return n * factorial(n - 1);
}int main() {cout << factorial(5) << endl;return 0;
}
九、循环和函数式编程

使用函数式编程风格可以简化循环代码,例如使用 std::accumulate 计算数组元素的和。

#include <iostream>
#include <vector>
#include <numeric>int main() {std::vector<int> v = {1, 2, 3, 4, 5};int sum = std::accumulate(v.begin(), v.end(), 0);std::cout << sum << std::endl;return 0;
}
十、循环和 Lambda 表达式

可以使用 Lambda 表达式增强循环的功能,例如排序。

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> v = {3, 1, 4, 1, 5, 9};std::sort(v.begin(), v.end(), [](int a, int b) {return a < b;});for (int num : v) {std::cout << num << " ";}return 0;
}

这些拓展内容涵盖了 C++ 循环的高级用法,包括 C++11 及以上标准引入的新特性,能让你更灵活、高效地使用循环语句,根据不同的场景选择合适的技术可以提高代码的性能和可读性。

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

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

相关文章

日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件

日历热力图&#xff0c;月度数据可视化图表&#xff0c;vue组件 先看效果&#x1f447; 在线体验https://www.guetzjb.cn/calanderViewGraph/ 日历图简单划分为近一年时间&#xff0c;开始时间是 上一年的今天&#xff0c;例如2024/01/01 —— 2025/01/01&#xff0c;跨度刚…

使用nginx搭建通用的图片代理服务器,支持http/https/重定向式图片地址

从http切换至https 许多不同ip的图片地址需要统一进行代理 部分图片地址是重定向地址 nginx配置 主站地址&#xff1a;https://192.168.123.100/ 主站nginx配置 server {listen 443 ssl;server_name localhost;#ssl证书ssl_certificate ../ssl/ca.crt; #私钥文件ssl_ce…

WPS数据分析000001

目录 一、表格的新建、保存、协作和分享 新建 保存 协作 二、认识WPS表格界面 三、认识WPS表格选项卡 开始选项卡 插入选项卡 页面布局选项卡 公式选项卡 数据选项卡 审阅选项卡 视图选项卡 会员专享选项卡 一、表格的新建、保存、协作和分享 新建 ctrlN------…

使用 HTML 开发 Portal 页全解析

前言 在当今数字化时代&#xff0c;网站作为企业和个人展示信息、提供服务的重要窗口&#xff0c;其重要性不言而喻。而 Portal 页&#xff0c;作为网站的核心页面之一&#xff0c;承担着引导用户、整合信息等关键任务。那么&#xff0c;如何使用 HTML 开发一个功能齐全、界面…

Spring Boot 项目启动报错 “找不到或无法加载主类” 解决笔记

一、问题描述 在使用 IntelliJ IDEA 开发基于 Spring Boot 框架的 Java 程序时&#xff0c;原本项目能够正常启动。但在后续编写代码并重建项目后&#xff0c;再次尝试运行却出现了 “错误&#xff1a;找不到或无法加载主类 com.example.springboot.SpringbootApplication” 的…

上位机工作感想-2024年工作总结和来年计划

随着工作年限的增增长&#xff0c;发现自己越来越不喜欢在博客里面写一些掺杂自己感想的东西了&#xff0c;或许是逐渐被工作逼得“成熟”了吧。2024年&#xff0c;学到了很多东西&#xff0c;做了很多项目&#xff0c;也帮别人解决了很多问题&#xff0c;唯独没有涨工资。来这…

ChatGPT被曝存在爬虫漏洞,OpenAI未公开承认

OpenAI的ChatGPT爬虫似乎能够对任意网站发起分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;而OpenAI尚未承认这一漏洞。 本月&#xff0c;德国安全研究员Benjamin Flesch通过微软的GitHub分享了一篇文章&#xff0c;解释了如何通过向ChatGPT API发送单个HTTP请求…

《keras 3 内卷神经网络》

keras 3 内卷神经网络 作者&#xff1a;Aritra Roy Gosthipaty 创建日期&#xff1a;2021/07/25 最后修改时间&#xff1a;2021/07/25 描述&#xff1a;深入研究特定于位置和通道无关的“内卷”内核。 &#xff08;i&#xff09; 此示例使用 Keras 3 在 Colab 中查看 GitHub …

GIFT ICA 下载记录

1.帮助文档 Group ICA/IVA Of fMRI Toolbox&#xff1b;【GIFT介绍】 Group ICA of fMRI Toolbox (GIFT) Walk Through&#xff1b;【流程介绍】 GIFT v1.3c Functions Srinivas Rachakonda, Eric Egolf and Vince Calhoun【流程解释】 2.下载记录 从官网下载程序包&#xff0…

LLMs(大型语言模型)的多智能体:Auto-GPT

LLMs(大型语言模型)的多智能体:Auto-GPT 是指在一个系统中集成多个具有不同能力、角色和任务的智能体,这些智能体能够相互协作、沟通和交互,以共同完成复杂的任务或解决复杂的问题。每个智能体都可以被视为一个独立的实体,具有自己的策略、目标和知识库,通过相互之间的…

【C++】C++11

目录 1. 整体学习思维导图 2. {}列表初始化 2.1 单个对象情况 2.2 多对象情况 3. 右值引用和移动语义 3.1 左值和右值 3.2 左值引用和右值引用 3.3 引用延迟生命周期 3.4 左值和右值的参数匹配 4. 左值引用和右值引用 4.1 左值引用 4.2 右值引用 5. 移动构造和移动…

无人机飞手考证难度增加,实操、地面站教学技术详解

随着无人机技术的快速发展和广泛应用&#xff0c;无人机飞手考证的难度确实在不断增加。这主要体现在对飞手的实操技能和地面站操作技术的要求上。以下是对无人机飞手考证中实操和地面站教学技术的详细解析&#xff1a; 一、实操教学技术详解 1. 无人机基础知识学习&#xff1…

解决npm install安装出现packages are looking for funding run `npm fund` for details问题

当我们运行npm install时&#xff0c;可能会收到类似以下的提示信息&#xff1a;“x packages are looking for funding.” 这并不是错误提示&#xff0c;也不会影响项目的正常运行。其实实在提醒有一些软件包正在寻求资金支持。 根据提示输入npm fund可以查看详细的信息&#…

程序员不可能不知道的常见锁策略

前面我们学习过线程不安全问题&#xff0c;我们通过给代码加锁来解决线程不安全问题&#xff0c;在生活中我们也知道有很多种类型的锁&#xff0c;同时在代码的世界当中&#xff0c;也对应着很多类型的锁&#xff0c;今天我们对锁一探究竟&#xff01; 1. 常见的锁策略 注意: …

当设置dialog中有el-table时,并设置el-table区域的滚动,看到el-table中多了一条横线

问题&#xff1a;当设置dialog中有el-table时&#xff0c;并设置el-table区域的滚动&#xff0c;看到el-table中多了一条横线&#xff1b; 原因&#xff1a;el-table有一个before的伪元素作为表格的下边框下&#xff0c;初始的时候已设置&#xff0c;在滚动的时候并没有重新设置…

模型部署工具01:Docker || 用Docker打包模型 Build Once Run Anywhere

Docker 是一个开源的容器化平台&#xff0c;可以让开发者和运维人员轻松构建、发布和运行应用程序。Docker 的核心概念是通过容器技术隔离应用及其依赖项&#xff0c;使得软件在不同的环境中运行时具有一致性。无论是开发环境、测试环境&#xff0c;还是生产环境&#xff0c;Do…

2025 最新flutter面试总结

目录 1.Dart是值传递还是引用传递&#xff1f; 2.Flutter 是单引擎还是双引擎 3. StatelessWidget 和 StatefulWidget 在 Flutter 中有什么区别&#xff1f; 4.简述Dart语音特性 5. Navigator 是什么&#xff1f;在 Flutter 中 Routes 是什么&#xff1f; 6、Dart 是不是…

Flask简介与安装以及实现一个糕点店的简单流程

目录 1. Flask简介 1.1 Flask的核心特点 1.2 Flask的基本结构 1.3 Flask的常见用法 1.3.1 创建Flask应用 1.3.2 路由和视图函数 1.3.3 动态URL参数 1.3.4 使用模板 1.4 Flask的优点 1.5 总结 2. Flask 环境创建 2.1 创建虚拟环境 2.2 激活虚拟环境 1.3 安装Flask…

记一次常规的网络安全渗透测试

视频教程在我主页简介和专栏里 目录&#xff1a; 前言 互联网突破 第一层内网 第二层内网 总结 前言 上个月根据领导安排&#xff0c;需要到本市一家电视台进行网络安全评估测试。通过对内外网进行渗透测试&#xff0c;网络和安全设备的使用和部署情况&#xff0c;以及网络…

Dockerfile另一种使用普通用户启动的方式

基础镜像的Dockerfile # 使用 Debian 11.9 的最小化版本作为基础镜像 FROM debian:11.11# 维护者信息 LABEL maintainer"caibingsen" # 复制自定义的 sources.list 文件&#xff08;如果有的话&#xff09; COPY sources.list /etc/apt/sources.list # 创建…