执行一次 初始化语句,然后重复执行 语句 和 迭代表达式,直至 条件 的值变成 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 离开作用域
关键词
注解
作为 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
- 循环测试
当前内容版权归 cppreference 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 cppreference .