Namespaces
Variants

for loop

From cppreference.net

执行循环。

用作 while 循环 的简写等价形式。

目录

语法

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

说明

行为如下:

  • init-clause 可以是表达式 或声明 (C99起)
  • 一个 初始化语句 (即表达式)会在首次计算 条件表达式 之前被求值一次,其结果将被丢弃。
  • 作为声明的 初始化子句 ,其作用域涵盖整个循环体,包括 初始化子句 的剩余部分、整个 条件表达式 、整个 迭代表达式 以及整个 循环语句 。在此声明中声明的变量仅允许使用 auto register 存储类说明符
(C99起)
  • cond-expression 在循环体执行前被求值。若表达式结果为零,则立即退出循环语句。
  • iteration-expression 在循环体执行后被求值,其结果将被丢弃。求值 iteration-expression 后,控制权将转移至 cond-expression

init-clause cond-expression iteration-expression 均为可选参数。若省略 cond-expression ,该位置将被替换为一个非零整型常量,从而形成无限循环:

for(;;) {
   printf("无限循环!");
}

loop-statement 不是可选的,但可以是一个空语句:

for(int n = 0; n < 10; ++n, printf("%d\n", n))
    ; // 空语句

若循环执行需要在某处终止,可在 循环语句 内的任意位置使用 break语句

在任何循环语句内部使用的 continue语句 会将控制权转移到 iteration-expression

若一个无限循环在其 条件表达式 迭代表达式 循环语句 的任何部分均无可观测行为(I/O操作、volatile访问、原子操作或同步操作),则该程序具有未定义行为。这使得编译器无需证明循环终止即可优化掉所有不可观测的循环。唯一例外的是省略 条件表达式 或条件表达式为常量表达式的情况; for ( ;; ) 始终构成无限循环。

与所有其他选择语句和迭代语句一样,for语句会建立 块作用域 :任何在 初始化子句 条件表达式 迭代表达式 中引入的标识符,都会在 循环语句 结束后离开作用域。

(C99起)

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

(自 C23 起)

关键词

for

注释

作为 循环语句 使用的表达式语句会建立其自身的块作用域,该作用域与 初始化子句 的作用域相互独立,这与C++中的行为不同:

for (int i = 0; ; ) {
    long i = 1;   // 有效的C语言,无效的C++
    // ...
}

可以使用 goto 进入循环体。通过这种方式进入循环时, init-clause cond-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语句(页码:136)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 3.6.5.3 for 语句

参见

C++ 文档 关于 for 循环