for 循环

来自cppreference.com
< cpp‎ | language

执行一次 init-statement 然后重复执行 statementiteration_expression ,直至 condition 的值变成 false 。此检测发生于迭代前。

目录

[编辑] 语法

    正式语法:
attr(可选) for ( init-statement condition(可选) ; iteration_expression(可选) ) statement
    非正式语法:
attr(可选) for ( declaration-or-expression(可选) ; declaration-or-expression(可选) ; expression(可选) ) statement
attr(C++11) - 任何数量的属性
init-statement - 下列之一
  • 一条表达式语句(可为空语句; ”)
  • 一条简单声明,典型的是带初始化器的循环计数变量的声明,但它可以声明任意多个变量
注意任何 init-statement 必须以分号 ; 结束,此乃它之所以经常被非正式描述作后随分号的表达式或声明。
condition - 下列之一
  • 一条可语境转换到 bool 的表达式语句。此表达式在每次迭代前求值,且若它产生 false ,则退出循环。
  • 一条单变量的声明,带有花括号或等号初始化器。初始化器在每次迭代前求值,且若被声明变量的值转换为 false ,则退出循环。
iteration_expression - 任何表达式,在每次迭代后和每次 condition 的再求值前求值。典型的是增加循环计数器的表达式。
statement - 任何语句,典型的是复合语句,它是循环体

[编辑] 解释

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

{
init_statement
while ( condition ) {
statement
iteration_expression ;
}

}

除了

1) init-statement 所声明的名称(若 init-statement 是声明)和 condition 所声明的名称(若 condition 是声明)在同一作用域中(亦是 statement 的作用域)。
2) statement 中的 continue 将执行 iteration_expression
3) 空的 condition 等价于 while(true)

若循环的执行需要在某些点终止,则可以 break 语句为终止语句。

若循环的执行需要在循环体结尾继续,则可以 continue 语句为快捷方式。

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

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

[编辑] 关键词

for

[编辑] 注意

作为 C++ 向前进展保证的一部分,若循环无可观察行为(不调用 I/O 函数、访问 volatile 对象,或进行原子或同步操作)且不终止,则行为未定义。允许编译器移除这种循环。

C++ 中, init-statement 的作用域与 statement 的作用域是同一的,而在 C 中 statement 的作用域嵌套于 init-statement 的作用域中:

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';
 
    // init-statement 可声明多个名称,
    // 只要它们能用拥有相同的 decl-specifier-seq
    for (int i = 0, *p = &i; i < 9; i += 2) {
        std::cout << i << ':' << *p << ' ';
    }
    std::cout << '\n';
 
    // condition 可为声明
    char cstr[] = "Hello";
    for (int n = 0; char c = cstr[n]; ++n)
        std::cout << c;
    std::cout << '\n';
 
    // init-statement 可使用 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';
 
   // init-statement 可为表达式
    int n = 0;
    for (std::cout << "Loop start\n";
         std::cout << "Loop test\n";
         std::cout << "Iteration " << ++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 
Loop start
Loop test
Iteration 1
Loop test
Iteration 2
Loop test

[编辑] 参阅

范围 for 循环 执行范围上的循环 (C++11 起) [编辑]
forC 文档