for 循环
执行循环。
用作 while 循环的更短等价形式。
目录 |
[编辑] 语法
attr-spec-seq(since C23)(optional) for ( init-clause ; cond-expression ; iteration-expression ) loop-statement |
|||||||||
[编辑] 解释
行为如下
- init-clause 可以是表达式 或声明(since C99)。
- 作为表达式的 init-clause 在首次评估 cond-expression 之前评估一次,其结果被丢弃。
|
(since C99) |
- cond-expression 在循环体之前评估。如果表达式的结果为零,则立即退出循环语句。
- iteration-expression 在循环体之后评估,其结果被丢弃。在评估 iteration-expression 之后,控制权转移到 cond-expression。
init-clause、cond-expression 和 iteration-expression 都是可选的。如果省略 cond-expression,则会将其替换为非零整数常量,这会使循环变为无限循环
for(;;) { printf("endless loop!"); }
loop-statement 不是可选的,但它可以是空语句
for(int n = 0; n < 10; ++n, printf("%d\n", n)) ; // null statement
如果需要在某个时候终止循环的执行,则可以在 loop-statement 内的任何位置使用 break 语句。
在 loop-statement 内的任何位置使用的 continue 语句 将控制权转移到 iteration-expression。
如果无限循环在其 cond-expression、iteration-expression 或 loop-statement 的任何部分中都没有可观察的行为(I/O、volatile 访问、原子或同步操作),则具有未定义行为的程序。这允许编译器优化掉所有不可观察的循环,而无需证明它们终止。唯一的例外是省略 cond-expression 或为常量表达式的循环;for(;;)
始终是无限循环。
与所有其他选择和迭代语句一样,for 语句建立块作用域:在 init-clause、cond-expression 或 iteration-expression 中引入的任何标识符在 loop-statement 之后都会超出作用域。 |
(since C99) |
attr-spec-seq 是应用于 |
(since C23) |
[编辑] 关键字
[编辑] 注释
用作 loop-statement 的表达式语句建立了自己的块作用域,这与 C++ 中的 init-clause 的作用域不同
for (int i = 0; ; ) { long i = 1; // valid C, invalid C++ // ... }
可以使用 goto 进入循环体。以这种方式进入循环时,不会执行 init-clause 和 cond-expression。(如果控制随后到达循环体的末尾,则可能会发生重复,包括执行 cond-expression。)
[编辑] 示例
可能的输出
Array filled! 1 0 1 1 1 1 0 0
[编辑] 参考
- C17 标准 (ISO/IEC 9899:2018)
- 6.8.5.3 for 语句 (p: 110)
- C11 标准 (ISO/IEC 9899:2011)
- 6.8.5.3 for 语句 (p: 151)
- C99 标准 (ISO/IEC 9899:1999)
- 6.8.5.3 for 语句 (p: 136)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 3.6.5.3 for 语句
[编辑] 参见
C++ 文档 for
for loop |