while 循环
来自 cppreference.com
重复执行 statement,直到 expression 的值等于零。测试在每次迭代之前进行。
内容 |
[编辑] 语法
attr-spec-seq(optional) while ( expression ) statement |
|||||||||
expression | - | 任何 表达式 的 标量类型。此表达式在每次迭代之前进行评估,如果它与零相等,则退出循环。 |
statement | - | 任何 语句,通常是复合语句,用作循环的主体 |
attr-spec-seq | - | (C23)可选的 属性 列表,应用于循环语句 |
[编辑] 解释
while
语句导致 statement(也称为循环体)重复执行,直到 expression(也称为控制表达式)与零相等。无论循环体是正常进入还是通过 goto 进入 statement 的中间,都会发生重复。
expression 的评估在每次执行 statement 之前进行(除非通过 goto 进入)。如果控制表达式需要在循环体之后进行评估,则可以使用 do-while 循环。
如果需要在某个时刻终止循环的执行,则可以使用 break 语句 作为终止语句。
如果需要在循环体末尾继续执行循环,则可以使用 continue 语句 作为快捷方式。
具有无限循环的程序如果循环在其 statement 或 expression 的任何部分中没有可观察的行为(I/O、易失性访问、原子或同步操作),则具有未定义的行为。这允许编译器优化掉所有不可观察的循环,而无需证明它们会终止。唯一的例外是 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++ 文档 for
while 循环 |