for 循环

来自cppreference.com
< cpp‎ | language

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

目录

[编辑] 语法

    正式语法:
属性(可选) for ( 初始化语句(含分号) 条件(可选) ; 迭代表达式(可选) ) 语句
    非正式语法:
属性(可选) for ( 声明/表达式(可选) ; 声明/表达式(可选) ; 表达式(可选) ) 语句
属性(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 起) [编辑]
forC 文档