for 循环

< cpp‎ | language

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

语法

    正式语法:
attr(可选) for ( 初始化语句 条件(可选) ; 迭代表达式(可选) ) 语句
    非正式语法:
attr(可选) for ( 声明或表达式(可选) ; 声明或表达式(可选) ; 表达式(可选) ) 语句
attr(C++11) - 任何数量的属性
初始化语句 - 下列之一
  • 一条表达式语句(可为空语句;”)
  • 一条简单声明,通常为带初始化器的循环计数变量的声明,但它可以声明任意多个变量
注意任何 初始化语句 必须以分号 ; 结束,因此它经常被非正式描述为后随分号的表达式或声明。
条件 - 下列之一
  • 可按语境转换到 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) 执行范围上的循环