回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C/C++教程 >> C 语言基础教程 >> 41. do while 循环
最 近 更 新
54. goto 语句
53. switch 语句推荐
52. continue 和 break
51. 条件运算符(?:)
50. if 语句嵌套推荐
49. 逻辑运算符推荐
48. 在循环中使用 if 语句推荐
47. if 和 else 连用推荐
46. if 语句
45. 循环应用实例 2
最 新 推 荐
53. switch 语句推荐
50. if 语句嵌套推荐
49. 逻辑运算符推荐
48. 在循环中使用 if 语句推荐
47. if 和 else 连用推荐
44. 循环应用实例 1推荐
43. 循环嵌套推荐
40. for 循环推荐
37. 关系运算符推荐
36. while 循环推荐
热 门 排 行
2. 第一个 C 程序推荐
31. 预处理指令 #define..推荐
1. C 语言简介
11. 基本数据类型:整型..推荐
24. 运算符的优先级和结..推荐
5. 如何编写函数
30. 字符串字面量推荐
13. 标识符命名规则
36. while 循环推荐
7. 第三个 C 程序推荐
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

41. do while 循环


来源:蚂蚁的 C/C++ 标准编程 作者:antigloss 等级:精品
发布于2006-10-07 21:13 被读3048次 【字体:

Antigloss 最后修改于 2006-12-29

    while 循环和 for 循环在每次进入循环体之前都要检查进入循环体的条件是否成立,故而循环体有可能一次都不会被执行。而我们下面所要说的 do while 循环却恰恰相反,它在每次循环体执行完毕才会检查进入循环体的条件是否成立,这就保证了循环体至少会被执行一次。do while 循环的结构为:

        do
            一条语句/复合语句(即循环体)
        while ( condition );

注意:while ( condition ); 这里的分号(;)可千万不能省!

    do while 循环的执行过程如下图所示:

第一次进入循环体时,不用先检查 condition 是否成立,而是马上进入循环体,等循环体执行完毕后才检查 condition 是否为真,如果为真,则再次执行循环体,反之,则退出循环,转而执行后续的语句。其中,condition 可以是任何合法的表达式。例如:

        #include <stdio.h>
        #include <string.h>

        #define  NAME  "Antigloss"

        int main(void)
        {
            char name[20];

            do
            {
                printf("Please guess what's my name: ");
                scanf("%19s", name);
            } while ( strcmp(NAME, name) );

            printf("Yeah! You got it!\n");

            return 0;
        }

上例中,第一次进入循环体时,不需检查 strcmp(NAME, name) 是否为真(strcmp 函数用于判断两个字符串是否相等,如果相等,则返回 0),而是立刻无条件执行循环体:先输出 Please guess what's my name: ,然后等待用户输入(scanf 函数中的 "%19s" 命令 scanf 最多把用户输入中的 19 个字符放入数组 name);循环体执行完后才检测 strcmp(NAME, name) 是否为真:如果 NAME 不等于 name,则 strcmp 返回非 0(真),再次执行循环体,如果 NAME 等于 name,则 strcmp 返回 0(假),退出循环,转而执行后续的语句,即 printf("Yeah! You got it!\n"); 。由于使用了 do while 循环,本例中的循环体至少会被执行一次。

    当格式限定符为 %s 时,scanf 在把用户输入读入数组后,会自动在数组中最后一个被读入的字符后面添上 \0,又因为我们把 name 定义成只有 20 个元素的数组,所以我们需要使用 %19s(可以小于 19,但绝不能大于 19)控制 scanf 如何接收用户输入,防止对尚未分配的空间进行读写。这样,就算用户输入了 300 个字符,scanf 也只会把前面的 19 个字符读入数组,然后添上 \0。使用 strcmp 函数需要先包含标准头文件 string.h

    与上例等价的 while 循环如下:

        #include <stdio.h>
        #include <string.h>

        #define  NAME  "Antigloss"

        int main(void)
        {
            char name[20];

            printf("Please guess what's my name: ");
            scanf("%19s", name);

            while ( strcmp(NAME, name) )
            {
                printf("Please guess what's my name: ");
                scanf("%19s", name);
            }

            printf("Yeah! You got it!\n");

            return 0;
        }

由于使用的是 while 循环,本例中的循环体有可能一次都不会被执行。

参考资料:C Primer 5th Edition
          The C Programming Language 2nd Edition
          C99 标准

本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 antigloss 共同所有,转载请注明原作者和出处。谢谢。



相关专题:C 循环语句
45. 循环应用实例 2
44. 循环应用实例 1

上一篇:40. for 循环
下一篇:42. 复合赋值运算符

共有评论 7 条 网友评分 1分 查看全部评论

游客:骷骨
评分:0
scanf("%19s",name);
中的%没有编写进去,编译完运行,输入字符或者直接回车,会出现无限循环Please guess what's my name这一句,请问是为什么。谢谢,我用的是windows下可视化win-tc编译器
游客:antigloss
评分:0
请问你为何要去掉 %?
至于为何会无限循环,请参考
http://stdcpp.cn/html/3/3/0510/6.htm

另外,tc太旧了,建议你用 Dev-C++
http://stdcpp.cn/html/8/17/0511/93.htm
游客:骷骨
评分:0
去掉%是无意中的,知道原因了,谢谢。
Dev-C++去下载了,刚使用,还不是很理解。
游客:c
评分:0
是否应该在scanf("%19s", name);后加上 fflush(stdin);
游客:antigloss
评分:0
fflush(stdin);是错的。请参考:http://stdcpp.cn/html/3/3/0510/6.htm
游客:游民
评分:0
输入的字符串如:Anti gloss ,为什么只能取到空格之前的字符Anti?
游客:antigloss
评分:0
请认真阅读这篇文章
http://stdcpp.cn/html/1/2/0604/140.htm

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss