do-while 循环
来自 cppreference.com
重复执行 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 语句 作为快捷方式。
具有无限循环的程序如果循环在其任何部分的 statement 或 expression 中没有可观察的行为(I/O、易失性访问、原子或同步操作),则具有未定义的行为。这允许编译器优化所有不可观察的循环,而无需证明它们会终止。唯一的例外是 expression 是一个常量表达式的循环;do {...} while(true);
始终是一个无限循环。
与所有其他选择和迭代语句一样,do-while 语句建立 块级作用域:在 expression 中引入的任何标识符在语句之后将超出作用域。 |
(自 C99 以来) |
[编辑] 注释
布尔值和指针表达式通常用作循环控制表达式。布尔值 false
和任何指针类型的空指针值与零相等。
[编辑] 关键字
[编辑] 示例
运行此代码
#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 循环 |