命名空间
变体
操作

do-while 循环

来自 cppreference.cn
< c‎ | 语言

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

目录

[编辑] 语法

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

[编辑] 解释

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

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

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

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

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

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

(C99 起)

[编辑] 注意

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

[编辑] 关键字

do, while

[编辑] 示例

#include <stdio.h>
#include <stdlib.h>
enum { SIZE = 8 };
int main(void)
{
    // trivial example
    int array[SIZE], n = 0;
    do array[n++] = rand() % 2; // the loop body is a single expression statement
    while(n < SIZE);
    puts("Array filled!");
    n = 0;
    do { // the loop body is a compound statement
        printf("%d ", array[n]);
        ++n;
    } while (n < SIZE);
    printf("\n");
 
    // the loop from K&R itoa(). The do-while loop is used
    // because there is always at least one digit to generate
    int num = 1234, i=0;
    char s[10];
    do s[i++] = num % 10 + '0'; // get next digit in reverse order
    while ((num /= 10) > 0);
    s[i] = '\0';
    puts(s);
}

可能的输出

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

[编辑] 参考

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

[编辑] 另请参阅

C++ 文档 关于 do-while 循环