命名空间
变体
操作

do-while 循环

来自 cppreference.com
< c‎ | 语言

重复执行 statement,直到条件 expression 的值为假。测试发生在每次迭代之后。

内容

[编辑] 语法

attr-spec-seq(可选) do statement while ( expression ) ;
表达式 - 任何 表达式,类型为 标量类型。该表达式在每次迭代后计算,如果它与零相等,则退出循环。
statement - 任何 语句,通常是复合语句,是循环的主体
attr-spec-seq - (C23)可选的 属性 列表,应用于循环语句

[编辑] 说明

do-while 语句导致 statement(也称为循环主体)重复执行,直到 expression(也称为控制表达式)与 0 相等。重复发生,无论循环主体是否正常进入或通过 goto 进入 statement 的中间。

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

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

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

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

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

(自 C99 以来)

[编辑] 注释

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

[编辑] 关键字

dowhile

[编辑] 示例

#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++ 文档 for do-while 循环