文章目录
- [第一章 C++20核心语法特性](#第一章 C++20核心语法特性)
-
- [1.8 范围 `for` 循环的初始化语句](#1.8 范围
for循环的初始化语句) -
- [1.8.1 语法格式](#1.8.1 语法格式)
- [1.8.2 示例](#1.8.2 示例)
- [1.8 范围 `for` 循环的初始化语句](#1.8 范围
本文记录C++20新特性之范围 for 循环的初始化语句。
第一章 C++20核心语法特性
1.8 范围 for 循环的初始化语句
在 C++17 中,标准委员会为 if 和 switch 语句引入了初始化语句(例如 if (auto val = getVal(); val > 0)),这极大地优化了变量的作用域控制。
到了 C++20,这一优秀的特性终于被扩展到了 范围 for 循环 (Range-based for loop) 中。这虽然是一个语法上的小糖果,但对于写出"高内聚、低耦合"的代码有着重要的意义。
1.8.1 语法格式
语法格式:
cpp
for (初始化语句; 范围声明 : 范围表达式) {
// 循环体
}
初始化语句:只执行一次。在这里定义的变量,其生命周期贯穿整个循环(包括循环体),并在循环结束时自动销毁。
作用域:变量仅在循环内部可见,不会泄漏到外部。
1.8.2 示例
示例1:解决索引变量的作用域问题
下面将索引变量限制在 for 循环作用域内。
cpp
void test()
{
vector<int> vec = { 1,2,3,4,5 };
for (int index = 0; const auto& v : vec)
{
std::cout << "Index " << index << ": " << v << std::endl;
++index;
}
/*
Index 0: 1
Index 1: 2
Index 2: 3
Index 3: 4
Index 4: 5
*/
}
示例2:配合C++20Ranges视图
虽然 C++20 的 Ranges 库本身就很强大,但有时我们需要在管道操作前定义一些辅助常量。
cpp
void test()
{
//
std::vector<int> vec = { 10,20,30,40,50 };
//
for (int threadhold = 30; int i : vec | std::views::filter([threadhold](int n) {
return n > threadhold;
}))
{
cout << i << " ";
}
cout << endl;
// 40 50
}