while loop
重复执行 语句 ,直到 表达式 的值等于零。该测试在每次迭代之前进行。
目录 |
语法
属性说明序列
(可选)
while (
表达式
)
语句
|
|||||||||
| expression | - | 任意 标量类型 的 表达式 。该表达式在每次迭代前求值,若结果等于零则退出循环。 |
| statement | - | 任意 语句 ,通常作为循环体的复合语句 |
| attr-spec-seq | - | (C23) 可选的 属性 列表,应用于循环语句 |
说明
while
语句会导致
语句
(也称为
循环体
)被重复执行,直到
表达式
(也称为
控制表达式
)比较结果等于零。无论循环体是通过正常进入还是通过
goto
跳转到
语句
中间进入,都会发生重复执行。
在每次执行 语句 之前(除非通过goto进入),都会对 表达式 进行求值。如果需要在循环体之后对控制表达式进行求值,可以使用 do-while循环 。
如果需要在某个点终止循环的执行,可以使用 break语句 作为终止语句。
若循环体的执行需要在循环体末尾继续执行,可使用 continue 语句 作为快捷方式。
若程序中的无限循环在其 语句 或 表达式 的任何部分均无可观测行为(如I/O操作、volatile访问、原子操作或同步操作),则该循环具有未定义行为。这使得编译器无需证明循环终止即可优化掉所有不可观测的循环。唯一例外的是 表达式 为常量表达式的情况: while ( true ) 始终构成无限循环。
|
与所有其他选择语句和迭代语句一样,while语句会建立 块作用域 :任何在 表达式 中引入的标识符都会在 语句 结束后超出作用域。 |
(since C99) |
注释
布尔值和指针表达式常被用作循环控制表达式。布尔值
false
与任何指针类型的空指针值在比较时均等同于零值。
关键词
示例
#include <stdio.h> #include <stdlib.h> #include <string.h> enum { SIZE = 8 }; int main(void) { // 简单示例 int array[SIZE], n = 0; while(n < SIZE) array[n++] = rand() % 2; puts("Array filled!"); n = 0; while(n < SIZE) printf("%d ", array[n++]); printf("\n"); // 经典 strcpy() 实现 // (将以空字符结尾的字符串从 src 复制到 dst) char src[] = "Hello, world", dst[sizeof src], *p = dst, *q = src; while((*p++ = *q++)) // 双括号(并非严格必需) // 用于抑制警告,确保这是有意为之的赋值操作 //(而非比较操作),其结果被用作真值 ; // 空语句 puts(dst); }
输出:
Array filled! 1 0 1 1 1 1 0 0 Hello, world
参考文献
- C17 标准 (ISO/IEC 9899:2018):
-
- 6.8.5.1 while 语句 (p: 109)
- C11 标准 (ISO/IEC 9899:2011):
-
- 6.8.5.1 while 语句 (p: 151)
- C99标准(ISO/IEC 9899:1999):
-
- 6.8.5.1 while语句(页码:136)
- C89/C90 标准 (ISO/IEC 9899:1990):
-
- 3.6.5.1 while 语句
参见
|
C++ 文档
关于
while
循环
|