Namespaces
Variants

do-while loop

From cppreference.net

重复执行 语句 ,直到条件 表达式 的值变为 false。该测试在每次迭代后进行。

目录

语法

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

说明

do - while 语句会使 语句 (也称为 循环体 )重复执行,直到 表达式 (也称为 控制表达式 )的值等于 0 。无论循环体是通过正常进入还是通过 goto 跳转到 语句 中间进入,都会发生重复执行。

表达式 的求值发生在每次 语句 执行之后(无论是正常进入还是通过 goto 进入)。若控制表达式需要在循环体之前求值,可使用 while循环 for循环

若需要在某个时刻终止循环的执行,可使用 break 语句 作为终止语句。

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

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

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

(since C99)

注释

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

关键词

do , while

示例

#include <stdio.h>
#include <stdlib.h>
enum { SIZE = 8 };
int main(void)
{
    // 简单示例
    int array[SIZE], n = 0;
    do array[n++] = rand() % 2; // 循环体是单个表达式语句
    while(n < SIZE);
    puts("Array filled!");
    n = 0;
    do
    { // 循环体是复合语句
        printf("%d ", array[n]);
        ++n;
    } while (n < SIZE);
    printf("\n");
    // 来自K&R itoa()的循环。使用do-while循环
    // 因为至少需要生成一位数字
    int num = 1234, i=0;
    char s[10];
    do s[i++] = num % 10 + '0'; // 按逆序获取下一位数字
    while ((num /= 10) > 0);
    s[i] = '\0';
    puts(s);
}

可能的输出:

Array filled!
1 0 1 1 1 1 0 0
4321

参考文献

  • C23 标准 (ISO/IEC 9899:2024):
  • 6.8.6.3 do 语句 (p: 156)
  • C17 标准 (ISO/IEC 9899:2018):
  • 6.8.5.2 do 语句 (页: 109)
  • C11 标准 (ISO/IEC 9899:2011):
  • 6.8.5.2 do 语句 (p: 151)
  • C99标准(ISO/IEC 9899:1999):
  • 6.8.5.2 do语句(页码:136)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 3.6.5.2 do 语句

参见

C++ documentation for do - while loop