do-while loop
重复执行 语句 ,直到条件 表达式 的值变为 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 ) ; 始终是无限循环。
|
与所有其他选择语句和迭代语句一样,
|
(since C99) |
注释
布尔表达式和指针表达式常被用作循环控制表达式。布尔值 false 与任何指针类型的空指针值在比较时等同于零值。
关键词
示例
#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
|