C语言while和do while循环详解(附带实例)
在有些时候,可能需要多次执行同一个语句或者语句块。C语言提供了循环结构以达到这个目的,循环结构允许多次执行同一个语句或语句块。
C语言中的循环结构有 3 种,分别是 while 循环、do while 循环和 for 循环。本节主要带大家学习前两种,关于 for 循环,可以阅读《C语言for循环的用法(非常详细)》一文。
while 循环的具体格式如下:
while 循环的特点为:如果 while 语句中的条件一开始就不成立,那么循环体中的语句永远不会被执行。
【实例】通过 while 循环统计 1~100 的和。代码如下:

图 1 程序执行流程图
【实例】输入一行字符(以回车作为结束),分别统计出其中英文字母、空格、数字和其他字符的个数。代码如下:

图 2 执行流程图
编译运行,结果如下:
do while 的语法格式如下:
与 while 循环一样,要确保 do while 循环的循环体部分修改了 condition 中的某个变量,从而改变 condition 的判断结果,能够结束循环,否则循环将永远重复下去,成为“死循环”。
【实例】统计十进制正整数 n 转换为二进制数后,其二进制序列中包含的 1 和 0 的个数。
这个实例相对较难,先理解转换过程。将十进制正整数 n 转换成二进制数,一般采用“除 2 取余,倒序输出”的方法,即用 2 整除十进制整数,可以得到一个商和余数;再用 2 去除商,又会得到一个商和余数。如此反复进行,直到商小于 1,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
本例中,n 的初始值取 69,69 一直除以 2,得到的余数逆序排列为 1000101,如下图所示,由此得到 69 转二进制数为 1000101。

图 3 十进制数转二进制数
程序代码如下:

图 4 程序执行流程图
C语言中的循环结构有 3 种,分别是 while 循环、do while 循环和 for 循环。本节主要带大家学习前两种,关于 for 循环,可以阅读《C语言for循环的用法(非常详细)》一文。
C语言while循环
只要给定的条件为真,C 语言中的 while 循环语句就会重复执行一个目标语句。while 循环的具体格式如下:
while ( 条件 ) { 语句1; 语句2; ... }具体规定如下:如果条件为真,就会执行循环体中的语句,然后再次判断条件,重复上述过程,直到条件不成立就结束 while 循环。
while 循环的特点为:如果 while 语句中的条件一开始就不成立,那么循环体中的语句永远不会被执行。
【实例】通过 while 循环统计 1~100 的和。代码如下:
#include <stdio.h> const int LOOP = 100; int main(void) { int i=1; int i_sum = 0; //sum的中文意思是总和 while(i <= LOOP) { i_sum += i; /*等价于i_sum = i_sum+i*/ i++; //++为自加, ++i相当于在循环后i = i + 1 } printf("i_sum = %d\n", i_sum); return 0; }输出结果为:
i_sum = 5050
程序执行的流程图如下图所示:
图 1 程序执行流程图
【实例】输入一行字符(以回车作为结束),分别统计出其中英文字母、空格、数字和其他字符的个数。代码如下:
#include<stdio.h> int main() { char c; int i_letters=0,i_spaces=0,i_digits=0,i_others=0; printf("请输入一些字符: \n"); while((c=getchar())!='\n') { if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) i_letters++; else if(c>='0'&&c<='9') i_digits++; else if(c==' ') i_spaces++; else i_others++; } printf("字母=%d,数字=%d,空格=%d, 其他=%d\n", i_letters, i_digits, i_spaces, i_others); return 0; }程序的流程图如下:

图 2 执行流程图
编译运行,结果如下:
请输入一些字符:
abc 123
字母=3,数字=3,空格=1,其他=0
C语言do while循环
do while 循环适用于“重复操作直到条件不成立为止”的循环控制结构,因而常被称作直到型循环。do while 的语法格式如下:
do { 循环体: //一条或多条 C 语句 }while (condition);do while 循环在执行循环体之后才检查 condition 表达式的值,所以 do while 循环的循环体至少执行一次。
与 while 循环一样,要确保 do while 循环的循环体部分修改了 condition 中的某个变量,从而改变 condition 的判断结果,能够结束循环,否则循环将永远重复下去,成为“死循环”。
【实例】统计十进制正整数 n 转换为二进制数后,其二进制序列中包含的 1 和 0 的个数。
这个实例相对较难,先理解转换过程。将十进制正整数 n 转换成二进制数,一般采用“除 2 取余,倒序输出”的方法,即用 2 整除十进制整数,可以得到一个商和余数;再用 2 去除商,又会得到一个商和余数。如此反复进行,直到商小于 1,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
本例中,n 的初始值取 69,69 一直除以 2,得到的余数逆序排列为 1000101,如下图所示,由此得到 69 转二进制数为 1000101。

图 3 十进制数转二进制数
程序代码如下:
#include <stdio.h> int main( ) { int i_a=69, i_s1=0, i_s0=0; do { if(i_a%2==1) i_s1++; //余数为1,则s1加1 else i_s0++; //余数为0,则s0加1 i_a/=2; //i_a= i_a /2 } while(i_a!= 0); //非0,则重复 “除2取余” 转换 printf("二进制序列中1的个数是: %d\n", i_s1); printf("二进制序列中0的个数是: %d\n", i_s0); return 0; }编译运行,结果如下:
二进制序列中1的个数是: 3
二进制序列中0的个数是: 4

图 4 程序执行流程图