命名空间
变体
操作

for 循环

来自 cppreference.cn
< 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

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

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

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

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

(C99 起)

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

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