while 循环
来自 cppreference.cn
重复执行 statement,直到 expression 的值等于零。测试在每次迭代之前进行。
目录 |
[编辑] 语法
attr-spec-seq(可选) while ( expression ) statement |
|||||||||
表达式 | - | 任何标量类型的表达式。此表达式在每次迭代之前进行求值,如果其结果等于零,则循环退出。 |
语句 | - | 任何语句,通常是复合语句,用作循环体 |
属性说明序列 | - | (C23)可选的属性列表,应用于循环语句 |
[编辑] 解释
while
语句会重复执行 statement(也称为循环体),直到 expression(也称为控制表达式)的比较结果等于零。无论循环体是正常进入还是通过 goto 跳转到 statement 中间,都会发生重复执行。
在每次执行 statement 之前(除非通过 goto 进入),都会对 expression 进行求值。如果需要在循环体之后对控制表达式进行求值,可以使用 do-while 循环。
如果需要在某个点终止循环的执行,可以使用 break 语句作为终止语句。
如果需要在循环体末尾继续循环的执行,可以使用 continue 语句作为快捷方式。
如果循环的任何部分(statement 或 expression)都没有可观察的行为(I/O、volatile 访问、原子或同步操作),则包含无限循环的程序具有未定义行为。这允许编译器优化掉所有不可观察的循环,而无需证明它们会终止。唯一的例外是 expression 是常量表达式的循环;while(true)
始终是无限循环。
与所有其他选择和迭代语句一样,while 语句建立块作用域:在 expression 中引入的任何标识符在 statement 之后都超出作用域。 |
(C99 起) |
[编辑] 注释
布尔表达式和指针表达式经常用作循环控制表达式。布尔值 false
和任何指针类型的空指针值都等于零。
[编辑] 关键字
[编辑] 示例
运行此代码
#include <stdio.h> #include <stdlib.h> #include <string.h> enum { SIZE = 8 }; int main(void) { // trivial example 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"); // classic strcpy() implementation // (copies a null-terminated string from src to dst) char src[] = "Hello, world", dst[sizeof src], *p = dst, *q = src; while((*p++ = *q++)) // double parentheses (that are not strictly necessary) // used to suppress warnings, ensuring that this is an // assignment (as opposed to a comparison) by intention, // whose result is used as a truth value ; // null statement 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 语句 (p: 136)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 3.6.5.1 while 语句
[编辑] 另请参见
C++ 文档,关于
while 循环 |