4.C++中的循环语句

server/2025/1/23 0:28:52/

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.ppmy.cn/server/160602.html

相关文章

数据库存储上下标符号,sqlserver 2008r2,dm8

sqlserver 2008r2&#xff1a; 数据类型需要用nvarchar插入数据时字符串前需要用N create table test( col1 varchar(50), col2 nvarchar(50) ) insert into test(col1,col2) values(U⁴⁵⁶⁷⁸⁹⁰D₁₂₃₄₅₆₇₈₉₀,U⁴⁵⁶⁷⁸⁹⁰D₁₂₃₄₅₆₇₈₉₀) insert into…

如何用AI智能生成PPT,提升工作效率和创意

如何用AI智能生成PPT&#xff0c;提升工作效率和创意&#xff01;在这个信息爆炸的时代&#xff0c;我们每个人的时间都变得尤为珍贵&#xff0c;尤其是在繁忙的工作中&#xff0c;如何更高效地完成任务变得至关重要。制作PPT往往让人既头痛又心烦。面对大量的内容整理和设计&a…

【Vim Masterclass 笔记24】S10L43 + L44:同步练习10 —— 基于 Vim 缓冲区的各类基础操作练习(含点评课)

文章目录 S10L43 Exercise 12 - Vim Buffers1 训练目标2 操作指令2.1. 打开 buf* 文件2.2. 查看缓冲区 View the buffers2.3. 切换缓冲区 Switch buffers2.4. 同时编辑多个缓冲区 Edit multiple buffers at once2.5. 缓冲区的增删操作 Add and delete buffers2.6. 练习 Vim 内置…

K8S中Pod控制器之CronJob(CJ)控制器

CronJob 控制器是 Kubernetes 中用于周期性执行任务的一种控制器&#xff0c;它基于 Job 控制器来创建和管理作业。以下是 CronJob 的一些关键特点&#xff1a; 周期性调度&#xff1a;CronJob 允许您定义一个基于时间的调度&#xff0c;类似于 Linux 的 cron 工具&#xff0c;…

MindAgent:基于大型语言模型的多智能体协作基础设施

2023-09-18 &#xff0c;加州大学洛杉矶分校&#xff08;UCLA&#xff09;、微软研究院、斯坦福大学等机构共同创建的新型基础设施&#xff0c;目的在评估大型语言模型在游戏互动中的规划和协调能力。MindAgent通过CuisineWorld这一新的游戏场景和相关基准&#xff0c;调度多智…

在 vscode + cmake + GNU 工具链的基础上配置 JLINK

安装 JLINK JLINK 官网链接 下载安装后找到安装路径下的可执行文件 将此路径添加到环境变量的 Path 中。 创建 JFlash 项目 打开 JFlash&#xff0c;选择新建项目 选择单片机型号 在弹出的窗口中搜索单片机 其他参数根据实际情况填写 新建完成&#xff1a; 接下来设置…

STM32 FreeRTOS中断管理

目录 FreeRTOS的中断管理 1、STM32中断优先级管理 2、FreeRTOS任务优先级管理 3、寄存器和内存映射寄存器 4、BASEPRI寄存器 5、FreeRTOS与STM32中断管理结合使用 vPortRaiseBASEPRI vPortSetBASEPRI 6、FromISR后缀 7、在中断服务函数中调用FreeRTOS的API函数需注意 F…

电脑如何访问手机文件?

手机和电脑已经深深融入了我们的日常生活&#xff0c;无时无刻不在为我们提供服务。除了电脑远程操控电脑外&#xff0c;我们还可以在电脑上轻松地访问Android或iPhone手机上的文件。那么&#xff0c;如何使用电脑远程访问手机上的文件呢&#xff1f; 如何使用电脑访问手机文件…