for 循环

来自cppreference.com
< cpp‎ | language

执行一次 初始化语句,然后重复执行 语句迭代表达式,直到 条件 的值变成 false。每次迭代前都进行该检测。

语法

    正式语法:
属性(可选) for ( 初始化语句 条件(可选) ; 迭代表达式(可选) ) 语句
    非正式语法:
属性(可选) for ( 声明或表达式(可选) ; 声明或表达式(可选) ; 表达式(可选) ) 语句
属性 - (C++11 起) 任意数量的属性
初始化语句 - 下列之一:
(C++23 起)
注意任何 初始化语句 必须以分号 ; 结束,因此它经常被非正式描述为后随分号的表达式或声明。
条件 - 下列之一:
  • 可以按语境转换到 bool 的表达式。在每次重复之前对此表达式求值,且如果它产生 false 则退出循环。
  • 带有花括号或等号初始化器的单一变量声明。初始化器在每次重复之前求值,且如果被声明变量的值转换为 false,那么退出循环。
迭代表达式 - 任意表达式,在循环的每次重复之后并在重复求值 条件 之前求值。通常是增加循环计数器的表达式。
语句 - 任意语句,通常是复合语句,作为循环体

解释

上述语法产生的代码等价于:

{
初始化语句
while ( 条件 ) {
语句
迭代表达式 ;
}

}

但有以下不同:

1) 初始化语句 声明的名字(如果 初始化语句 是声明)和 条件 声明的名字(如果 条件 是声明)处于同一作用域中(也是 语句 的作用域)。
2) 语句 中的 continue 将执行 迭代表达式
3) 空的 条件 等价于 while(true)

如果执行循环时需要在某些点终止,那么可以将 break 语句用作终止语句。

如果执行循环时需要在循环体末尾继续,那么可以将 continue 语句用作捷径。

while 循环的情况相同,如果 语句 是单个语句(非复合语句),那么声明于其中的变量的作用域被限制在循环体内,如同一条复合语句。

for (;;)
    int n;
// n 离开作用域

关键词

for

注解

作为 C++ 向前进展保证的一部分,如果没有可观察行为(不调用 I/O 函数,访问 volatile 对象,或进行原子或同步操作)的循环不会终止,那么它的行为未定义。编译器可以移除这种循环。

C++ 中,初始化语句 的作用域与 语句 的作用域一致,而在 C 中 语句 的作用域嵌套于 初始化语句 的作用域中:

for (int i = 0; ; ) {
    long i = 1;   // 在 C 中合法,在 C++ 中非法
    // ...
}

示例

#include <iostream>
#include <vector>
 
int main()
{
    // 典型的以单语句作为循环体的循环
    for (int i = 0; i < 10; ++i)
        std::cout << i << ' ';
    std::cout << '\n';
 
    // 初始化语句可以声明多个名字,
    // 只要它们可以使用相同的声明说明符序列
    for (int i = 0, *p = &i; i < 9; i += 2) {
        std::cout << i << ':' << *p << ' ';
    }
    std::cout << '\n';
 
    // (循环)条件可以是声明
    char cstr[] = "Hello";
    for (int n = 0; char c = cstr[n]; ++n)
        std::cout << c;
    std::cout << '\n';
 
    // 初始化语句可以使用 auto 类型说明符
    std::vector<int> v = {3, 1, 4, 1, 5, 9};
    for (auto iter = v.begin(); iter != v.end(); ++iter) {
        std::cout << *iter << ' ';
    }
    std::cout << '\n';
 
   // 初始化语句可以是表达式
    int n = 0;
    for (std::cout << "循环开始\n";
         std::cout << "循环测试\n";
         std::cout << "迭代 " << ++n << '\n')
        if(n > 1)
            break;
    std::cout << '\n';
}

输出:

0 1 2 3 4 5 6 7 8 9 
0:0 2:2 4:4 6:6 8:8 
Hello
3 1 4 1 5 9 
循环开始
循环测试
迭代 1
循环测试
迭代 2
循环测试

参阅

范围 for 循环(C++11) 执行范围上的循环