for loop
执行循环。
用作 while 循环 的简写等价形式。
目录 |
语法
attr-spec-seq
(自 C23 起)
(可选)
for
(
init-clause
;
cond-expression
;
iteration-expression
)
loop-statement
|
|||||||||
说明
行为如下:
- init-clause 可以是表达式 或声明 (C99起) 。
-
- 一个 初始化语句 (即表达式)会在首次计算 条件表达式 之前被求值一次,其结果将被丢弃。
|
(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
是一个可选的
属性
列表,应用于
|
(自 C23 起) |
关键词
注释
作为 循环语句 使用的表达式语句会建立其自身的块作用域,该作用域与 初始化子句 的作用域相互独立,这与C++中的行为不同:
for (int i = 0; ; ) { long i = 1; // 有效的C语言,无效的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语句(页码:136)
- C89/C90 标准 (ISO/IEC 9899:1990):
-
- 3.6.5.3 for 语句
参见
|
C++ 文档
关于
for
循环
|