命名空间
变体
操作

while 循环

来自 cppreference.cn
< c‎ | 语言

重复执行 statement,直到 expression 的值等于零。测试在每次迭代之前进行。

目录

[编辑] 语法

attr-spec-seq(可选) while ( expression ) statement
表达式 - 任何标量类型表达式。此表达式在每次迭代之前进行求值,如果其结果等于零,则循环退出。
语句 - 任何语句,通常是复合语句,用作循环体
属性说明序列 - (C23)可选的属性列表,应用于循环语句

[编辑] 解释

while 语句会重复执行 statement(也称为循环体),直到 expression(也称为控制表达式)的比较结果等于零。无论循环体是正常进入还是通过 goto 跳转到 statement 中间,都会发生重复执行。

在每次执行 statement 之前(除非通过 goto 进入),都会对 expression 进行求值。如果需要在循环体之后对控制表达式进行求值,可以使用 do-while 循环

如果需要在某个点终止循环的执行,可以使用 break 语句作为终止语句。

如果需要在循环体末尾继续循环的执行,可以使用 continue 语句作为快捷方式。

如果循环的任何部分(statementexpression)都没有可观察的行为(I/O、volatile 访问、原子或同步操作),则包含无限循环的程序具有未定义行为。这允许编译器优化掉所有不可观察的循环,而无需证明它们会终止。唯一的例外是 expression 是常量表达式的循环;while(true) 始终是无限循环。

与所有其他选择和迭代语句一样,while 语句建立块作用域:在 expression 中引入的任何标识符在 statement 之后都超出作用域。

(C99 起)

[编辑] 注释

布尔表达式和指针表达式经常用作循环控制表达式。布尔值 false 和任何指针类型的空指针值都等于零。

[编辑] 关键字

while

[编辑] 示例

#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 循环