命名空间
变体
操作

for 循环

来自 cppreference.cn
< c‎ | language

执行循环。

用作 while 循环的更短等价形式。

目录

[编辑] 语法

attr-spec-seq(since C23)(optional) for ( init-clause ; cond-expression ; iteration-expression ) loop-statement

[编辑] 解释

行为如下

  • init-clause 可以是表达式 或声明(since C99)
  • 作为表达式的 init-clause 在首次评估 cond-expression 之前评估一次,其结果被丢弃。
  • 作为声明的 init-clause 在整个循环体中都有效,包括 init-clause 的剩余部分、整个 cond-expression、整个 iteration-expression 和整个 loop-statement。只有 autoregister 存储类说明符 允许用于此声明中声明的变量。
(since 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

如果需要在某个时候终止循环的执行,则可以在 loop-statement 内的任何位置使用 break 语句

loop-statement 内的任何位置使用的 continue 语句 将控制权转移到 iteration-expression

如果无限循环在其 cond-expressioniteration-expressionloop-statement 的任何部分中都没有可观察的行为(I/O、volatile 访问、原子或同步操作),则具有未定义行为的程序。这允许编译器优化掉所有不可观察的循环,而无需证明它们终止。唯一的例外是省略 cond-expression 或为常量表达式的循环;for(;;) 始终是无限循环。

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

(since C99)

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

(since C23)

[编辑] 关键字

for

[编辑] 注释

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

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 loop