C参考手册
C 语法
for loop
执行一个循环。
用作 while 循环的较短等价物。
句法
for ( init_clause ; cond_expression ; iteration_expression ) loop_statement |
|
|
---|
说明
行为如下:
- init_clause 可能是一个表达式或一个声明
- 如果它是一个表达式,则在第一次评估cond_expression及其结果被放弃之前,它会被评估一次。
- (C99)如果它是一个声明,则它在整个循环体的范围内,包括 init_clause 的剩余部分,整个 cond_expression,整个iteration_expression 和整个 loop_statement。在这个声明中声明的变量只允许存储类
auto
和register
存储类。
- cond_expression在循环体之前被评估。如果表达式的结果为零,则循环语句立即退出。
- 迭代表达式在循环体及其结果被丢弃后进行计算。在评估迭代表达式之后,控制转移到cond_expression。
init_clause,cond_expression和iteration_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_expression,iteration_expression 或 loop_statement 的任何部分中没有可观察的行为(I / O,易失性访问,原子操作或同步操作),则具有无限循环的程序具有未定义的行为。这允许编译器优化所有不可观察的循环,而不会证明它们终止。唯一的例外是 cond_expression被省略或是一个常量表达式的循环; for(;;)
总是一个无止境的循环。
与所有其他选择和迭代语句一样,for 语句建立块范围:在 init_clause,cond_expression 或 iteration_expression 中引入的任何标识符超出了loop_statement之后的范围。 |
(自C99以来) |
---|
关键词
for
.
笔记
与 C ++不同,用作 loop_statement 的表达式语句建立了自己的块范围,与 init_clause 的范围截然不同:
for (int i = 0; ; ) {
long i = 1; // valid C, invalid C++
// ...
}
使用 goto 可以输入循环的主体。在这种情况下,init_clause 和 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]);
printf("\n");
}
可能的输出:
Array filled!
1 0 1 1 1 1 0 0
参考
- C11 standard (ISO/IEC 9899:2011):
- 6.8.5.3 The for statement (p: 151)
- C99 standard (ISO/IEC 9899:1999):
- 6.8.5.3 The for statement (p: 136)
- C89/C90 standard (ISO/IEC 9899:1990):
- 3.6.5.3 The for statement