C/C++从0到1系统精讲 项目开发综合基础课
C++循环结构
在C++中,循环结构用于重复执行一段代码直到满足特定条件为止。C++提供了三种主要的循环结构:for 循环、while 循环和 do-while 循环。每种循环都有其独特的使用场景和语法结构。
1. for 循环
for 循环是当您事先知道要执行多少次迭代时最常用的循环。它的语法如下:
cpp深色版本for (初始化; 条件; 更新) { // 循环体}
- 初始化:通常用于定义并初始化一个或多个控制变量。
- 条件:每次循环开始前都会检查这个布尔表达式。如果为真,则继续循环;否则退出循环。
- 更新:在每次循环体执行后更新控制变量。
示例:
cpp深色版本#include <iostream>using namespace std;int main() { for (int i = 0; i < 5; ++i) { cout << "当前值:" << i << endl; } return 0;}
2. while 循环
while 循环会在每次迭代之前检查给定条件,只有当条件为真时才会执行循环体内的语句。因此,如果初始状态下条件就为假,那么循环体可能一次都不会被执行。
cpp深色版本while (条件) { // 循环体}
示例:
cpp深色版本#include <iostream>using namespace std;int main() { int count = 0; while (count < 5) { cout << "当前计数:" << count << endl; ++count; } return 0;}
3. do-while 循环
do-while 循环与 while 循环类似,但有一个关键区别——它会先执行一次循环体,然后再检查条件。这意味着即使条件一开始就为假,循环体也会至少执行一次。
cpp深色版本do { // 循环体} while (条件);
示例:
cpp深色版本#include <iostream>using namespace std;int main() { int number = 0; do { cout << "输入一个数字(输入负数结束): "; cin >> number; if (number >= 0) { cout << "你输入了:" << number << endl; } } while (number >= 0); return 0;}
4. 控制循环的其他关键字
除了上述三种基本循环外,C++还提供了一些关键字来帮助更灵活地控制循环的行为:
break:立即终止最内层的循环,并跳出循环体。continue:跳过当前迭代中剩余的语句,直接进入下一次迭代。goto(不推荐):可以无条件跳转到程序中的另一位置,但由于可能导致代码难以阅读和维护,通常不建议使用。
5. 范围-based for 循环(C++11及以后)
从C++11开始,引入了一种新的for循环形式,称为范围-based for循环,它可以简化遍历容器(如数组、向量等)的操作。
cpp深色版本for (声明 : 表达式) { // 循环体}
示例:
cpp深色版本#include <iostream>#include <vector>using namespace std;int main() { vector<int> vec = {1, 2, 3, 4, 5}; for (int &val : vec) { val *= 2; // 修改每个元素的值 } for (const auto& item : vec) { cout << item << " "; // 输出修改后的值 } return 0;}
通过这些不同的循环结构及其组合,您可以根据具体需求选择最适合的方式实现所需的功能。理解它们的工作原理以及何时使用哪种循环将使您的编程更加高效和直观。
C++11还引入了哪些新的循环结构?
C++11确实引入了一种新的循环结构,即基于范围的for循环(Range-based for loop)。这种循环简化了遍历容器或数组中元素的过程。除此之外,C++11没有引入其他全新的循环结构,但它对现有的循环机制进行了一些改进和扩展,使得代码编写更加简洁和安全。
基于范围的for循环
语法:
cpp深色版本for (declaration : expression) { // 循环体}
- declaration:当前范围内元素的声明,通常是一个变量定义,这个变量会依次取得
expression中每个元素的值。 - expression:要迭代的序列,可以是花括号括起来的初始化列表、数组、容器类对象等,也可以是返回字符串或容器对象的函数。
特点:
- 自动处理迭代,避免了传统
for循环中可能出现的索引错误。 - 使代码更易于阅读和理解。
- 支持引用类型以允许修改容器中的元素。
示例:
cpp深色版本#include <iostream>#include <vector>using namespace std;int main() { vector<int> numbers = {1, 2, 3, 4, 5}; // 遍历并打印所有元素 for (const auto& num : numbers) { cout << num << " "; } cout << endl; // 修改容器中的元素 for (auto& elem : numbers) { elem *= 2; // 将每个元素翻倍 } // 再次遍历显示修改后的值 for (const auto& num : numbers) { cout << num << " "; } cout << endl; return 0;}
使用场景:
- 遍历标准库容器(如
std::vector,std::list,std::map等)。 - 遍历普通数组。
- 遍历初始化列表。
- 遍历返回容器类对象或字符串的函数的结果。
C++11 对现有循环机制的改进
除了引入基于范围的for循环外,C++11还通过以下方式增强了循环使用的灵活性和安全性:
auto关键字:允许编译器自动推断类型,这在遍历复杂类型的容器时非常有用。例如,在上面的例子中使用auto来代替具体的类型名。- 右值引用和移动语义:虽然不是直接与循环相关,但在某些情况下,它们可以提高性能,尤其是在处理大型对象时。例如,当从一个临时容器传递给另一个容器时,可以利用移动语义而不是复制。
- 线程支持库:虽然不直接改变循环结构本身,但新增的多线程编程功能为并行化循环提供了可能性,从而可以在多核处理器上实现更高的吞吐量。
综上所述,C++11主要通过引入基于范围的for循环以及增强现有特性和工具来改善循环结构的使用体验。这些变化不仅让代码更加清晰易读,同时也提高了程序的安全性和效率。