命名空间
变体
操作

for 循环

来自 cppreference.com
< c‎ | 语言

执行循环。

用作 while 循环 的更短等价物。

内容

[编辑] 语法

attr-spec-seq(自 C23)(可选) for ( init-clause ; cond-expression ; iteration-expression ) loop-statement

[编辑] 解释

行为如下

  • init-clause 可以是表达式 或声明(自 C99).
  • 作为表达式的 init-clause 会被评估一次,在第一次评估 cond-expression 之前,其结果会被丢弃。
  • 作为声明的 init-clause 在整个循环体内都有作用域,包括 init-clause 的剩余部分、整个 cond-expression、整个 iteration-expression 和整个 loop-statement。在这个声明中,只允许使用 autoregister 存储类说明符
(自 C99)
  • cond-expression 在循环体之前被评估。如果表达式的结果为零,则循环语句立即退出。
  • iteration-expression 在循环体之后被评估,其结果会被丢弃。评估 iteration-expression 后,控制权将转移到 cond-expression

init-clausecond-expressioniteration-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-expressioniteration-expressionloop-statement 的任何部分都没有可观察到的行为(I/O、易失性访问、原子或同步操作),则该程序的行为是未定义的。这允许编译器优化掉所有不可观察的循环,而无需证明它们会终止。唯一的例外是 cond-expression 被省略或是一个常量表达式的循环;for(;;) 始终是一个无限循环。

与所有其他选择和迭代语句一样,for 语句建立 块作用域:在 init-clausecond-expressioniteration-expression 中引入的任何标识符将在 loop-statement 之后超出作用域。

(自 C99)

attr-spec-seq 是一个可选的 属性 列表,应用于 for 语句。

(自 C23)

[编辑] 关键字

for

[编辑] 注释

用作 loop-statement 的表达式语句建立它自己的块作用域,这与 init-clause 的作用域不同,这与 C++ 中不同。

for (int i = 0; ; ) {
    long i = 1;   // valid C, invalid C++
    // ...
}

可以使用 goto 进入循环体。以这种方式进入循环时,不会执行 init-clausecond-expression。(如果控制权随后到达循环体的末尾,则重复可能发生,包括执行 cond-expression。)

[编辑] 示例

#include <stdio.h>
#include <stdlib.h>
enum { SIZE = 8 };
int main(void)
{
    int array[SIZE];
    for(size_t i = 0 ; i < SIZE; ++i)
        array [i] = rand() % 2;
    printf("Array filled!\n");
    for (size_t i = 0; i < SIZE; ++i)
        printf("%d ", array[i]);
    putchar('\n');
}

可能的输出

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 循环