do-while循环

来自cppreference.com
< c‎ | language

重复执行statement,直到condition的值变为假。此测试在每次迭代后发生。

目录

[编辑] 语法

do statement while ( expression ) ;
expression - 任何标量类型表达式。此表达式在每次迭代后求值,而且若它与零比较相等,则退出循环。
statement - 任何语句,典型的是一条复合语句,它是循环体

[编辑] 解释

do-while语句导致statement(亦称为循环体)被重复执行,直至expression(亦称为控制表达式)与0比较相等。不管是正常进入循环体还是以goto进入statement中部,都会发生重复。

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

若循环的执行需要在某些点终止,则可将break语句用作终止语句。

若循环的执行需要从循环体的结尾继续,则可将continue语句用作快捷方式。

拥有无限循环的程序有未定义行为,若该循环在其statementexpression的任何部分无可观测行为(I/O、volatile访问、原子或同步操作)。这允许编译器优化掉整个不可观测循环,而无需证明他们会结束。仅有的例外是其expression是常量表达式的循环:do {...} while(true);始终是无限循环。

同所有选择和迭代语句,do-while语句建立块作用域:任何引入于expression的标识符在语句后离开作用域。

(C99起)

[编辑] 注意

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

[编辑] 关键词

dowhile

[编辑] 示例

#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

[编辑] 参考

  • C11 standard (ISO/IEC 9899:2011):
  • 6.8.5.2 The do statement (p: 151)
  • C99 standard (ISO/IEC 9899:1999):
  • 6.8.5.2 The do statement (p: 136)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 3.6.5.2 The do statement

[编辑] 参阅

do-while循环C++文档