Namespaces
Variants

while loop

From cppreference.net

重复执行 语句 ,直到 表达式 的值等于零。该测试在每次迭代之前进行。

目录

语法

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

说明

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

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

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

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

若程序中的无限循环在其 语句 表达式 的任何部分均无可观测行为(如I/O操作、volatile访问、原子操作或同步操作),则该循环具有未定义行为。这使得编译器无需证明循环终止即可优化掉所有不可观测的循环。唯一例外的是 表达式 为常量表达式的情况: while ( true ) 始终构成无限循环。

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

(since C99)

注释

布尔值和指针表达式常被用作循环控制表达式。布尔值 false 与任何指针类型的空指针值在比较时均等同于零值。

关键词

while

示例

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