while 循环

来自cppreference.com
< c‎ | language

重复执行 语句 ,直到 表达式 的值变得比较等于零。此测试在每次迭代前发生。

语法

属性说明符序列(可选) while ( 表达式 ) 语句
表达式 - 任何标量类型表达式。在每次迭代前求值此表达式,而且若它与零比较相等,则退出循环。
语句 - 任何语句,常为一条复合语句,它被用作循环体
属性说明符序列 - (C23)可选的属性列表,应用到循环语句

解释

while 导致重复执行 语句 (亦称为循环体),直至 表达式 (亦称为控制表达式)与零比较相等。不管是正常进入循环体还是以 goto 进入 语句 内部,都会发生重复。

表达式的求值在每次执行 语句 前发生(除非用 goto 进入)。若需要在每次循环体后求值控制表达式,可以用 do-while 循环

若循环的执行需要在某些点终止,则能以 break 语句为作终止语句。

若循环的执行需要从循环体的结尾继续,则能以 continue 语句为快捷方式。

若无限循环在其 语句表达式 的任何部分无可观测行为( I/O 、 volatile 访问、原子或同步操作),则拥有这种循环的程序有未定义行为。这允许编译器优化掉整个不可观测循环,而无需证明他们会结束。仅有的例外是 表达式 为常量表达式的循环: while(true) 始终是无限循环。

同所有选择和迭代语句, while 语句建立块作用域:任何于 表达式 中引入的标识符在语句后离开作用域。

(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 The while statement (第 109 页)
  • C11 标准(ISO/IEC 9899:2011):
  • 6.8.5.1 The while statement (第 151 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 6.8.5.1 The while statement (第 136 页)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 3.6.5.1 The while statement

参阅