for 循环
执行循环。
用作 while 循环 的更短等价物。
内容 |
[编辑] 语法
attr-spec-seq(自 C23)(可选) for ( init-clause ; cond-expression ; iteration-expression ) loop-statement |
|||||||||
[编辑] 解释
行为如下
- init-clause 可以是表达式 或声明(自 C99).
- 作为表达式的 init-clause 会被评估一次,在第一次评估 cond-expression 之前,其结果会被丢弃。
|
(自 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
如果循环的执行需要在某个时刻终止,可以使用 break 语句 在 loop-statement 中的任何地方。
在 loop-statement 中的任何地方使用的 continue 语句 将控制权转移到 iteration-expression。
如果一个程序具有一个无限循环,并且该循环在其 cond-expression、iteration-expression 或 loop-statement 的任何部分都没有可观察到的行为(I/O、易失性访问、原子或同步操作),则该程序的行为是未定义的。这允许编译器优化掉所有不可观察的循环,而无需证明它们会终止。唯一的例外是 cond-expression 被省略或是一个常量表达式的循环;for(;;)
始终是一个无限循环。
与所有其他选择和迭代语句一样,for 语句建立 块作用域:在 init-clause、cond-expression 或 iteration-expression 中引入的任何标识符将在 loop-statement 之后超出作用域。 |
(自 C99) |
attr-spec-seq 是一个可选的 属性 列表,应用于 |
(自 C23) |
[编辑] 关键字
[编辑] 注释
用作 loop-statement 的表达式语句建立它自己的块作用域,这与 init-clause 的作用域不同,这与 C++ 中不同。
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 循环 |