C语言while循环和do while循环的用法(非常详细)

 
while 循环是C语言中常用的一种循环结构,而 do while 循环则是它的一种变体。

所谓循环(Loop),就是重复地执行同一段代码,直到满足特定的条件才会终止;例如要计算 1+2+3+……+99+100 的值,就要重复进行 99 次加法运算。

while 循环

while 循环的基本用法如下:
while (条件)
{
    // 循环体
    // 也即要重复执行的代码
}
当程序执行到 while 语句时,首先检测括号中的条件。如果条件为真(非零),则执行循环体中的代码。执行完循环体后,程序会再次回到 while 语句,重新检测括号中的条件。如果条件为真,将继续执行循环体中的代码……这个过程会一直重复,直到条件变为假(零)为止。一旦条件变为假,程序就会跳出循环(结束循环),继续执行循环后面的代码。

可以发现,整个 while 循环的过程就是「不断检测循环条件,并执行循环体」的过程。

while循环流程示意图
图1:while 循环流程示意图

while 这个英文单词本身的翻译是“当…的时候”,用在C语言中就是“当条件成立的时候”。

示例1:用 while 循环计算从 1 加到 100 的值。
#include <stdio.h>
int main() {
    int i = 1, sum = 0;
    while (i <= 100) {
        sum += i;
        i++;
    }
    printf("1加到100的和为:%d\n", sum);

    return 0;
}
运行结果:
1加到100的和为:5050

代码分析:
1) 程序运行到 while 时,因为 i=1,i<=100 成立,所以会执行循环体;执行结束后 i 的值变为 2,sum 的值变为 1。

2) 接下来会继续判断 i<=100 是否成立,因为此时 i=2,i<=100 成立,所以继续执行循环体;执行结束后 i 的值变为 3,sum 的值变为3。

3) 重复执行步骤 2)。

4) 当循环进行到第100次,i 的值变为 101,sum 的值变为 5050;因为此时 i<=100 不再成立,所以就退出循环,不再执行循环体,转而执行 while 循环后面的代码。

while 循环的整体思路是这样的:设置一个带有变量的循环条件,也即一个带有变量的表达式;在循环体中额外添加一条语句,让它能够改变循环条件中变量的值。这样,随着循环的不断执行,循环条件中变量的值也会不断变化,终有一个时刻,循环条件不再成立,整个循环就结束了。

如果循环条件中不包含变量,会发生什么情况呢?如果循环条件成立时的话,while 循环会一直执行下去,永不结束,称为“死循环”。例如:
#include <stdio.h>
int main(){
    while(1){
        printf("*");
    }
    return 0;
}
程序会不停地输出“*”,直到用户强制关闭。

另外,while 循环还有一个重要特点:如果循环条件一开始就不成立,那么循环体就一次也不执行。例如:
#include <stdio.h>

int main() {
    int i = 10;

    while (i < 5) {
        printf("This will never be printed\n");
        i++;
    }

    printf("Loop finished. i = %d\n", i);

    return 0;
}
输出结果:
Loop finished. i = 10
在这个例子中,i 的初始值是 10,大于 5,while 循环的条件从一开始就是假的,所以循环体内的代码一次都不会执行,程序将直接跳到循环后的 printf 语句。

do while 循环

do while 循环是 while 循环的一种变体,它的基本用法如下:
do {
    // 循环体
    // 要重复执行的代码
} while (条件);
do while 循环和 while 循环的不同在于:它会先执行一次循环体,然后再检测条件是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do while 循环至少要执行一次循环体。

注意,最后的分号;必须要写,不能省略。

while 循环执行 0~n 次循环体,do while 循环执行 1~n 次循环体,这就是它们之间的主要区别。

do while循环流程示意图
图2:do while 循环流程示意图

示例2:用 do while 循环计算从 1 加到 100 的值。
#include <stdio.h>
int main() {
    int i = 1, sum = 0;
    do {
        sum += i;
        i++;
    } while (i <= 100);
    printf("1加到100的和为:%d\n", sum);

    return 0;
}

综合示例

示例3:统计从键盘输入的字符串所包含的字符个数。
#include <stdio.h>
int main() {
    int n = 0;

    printf("请输入一个字符串(回车结束):");
    while (getchar() != '\n') {
        n++;
    }
    printf("字符的个数为:%d\n", n);

    return 0;
}
运行结果:
请输入一个字符串(回车结束):https://c.biancheng.net
字符的个数为:23
本例中的循环条件为getchar()!='\n',意思是,只要从键盘输入的字符不是回车就继续循环。循环体n++;完成对输入字符个数计数。

示例4:计算 n 的阶乘,也即n!
#include <stdio.h>

int main() {
    int n, factorial = 1;
    int temp;

    printf("请输入一个正整数:");
    scanf("%d", &n);

    temp = n;
    while (temp > 0) {
        factorial *= temp;
        temp--;
    }
    printf("%d 的阶乘是 %d\n", n, factorial);

    return 0;
}
运行结果
请输入一个正整数:8
8 的阶乘是 40320
循环从输入的数字开始,每次迭代都将当前数字与累积的阶乘相乘,然后将数字减 1。这个过程会一直持续,直到数字变为 0。

总结

while 循环和 do while 循环都是C语言中常用的循环结构,它们的主要区别在于循环条件的检测时机:
  • while 先检测循环条件,如果条件不成立,就一次也不执行循环体。
  • do while 先执行一次循环体,然后再检测循环条件;即使条件不成立,do while 也要执行一次循环体。

while 和 do while 都有各自的应用场景,但是从实际开发来看,还是 while 使用得更多。

在使用 while 循环时,有几点需要特别注意:

1) 循环条件的更新:确保在循环体内更新循环条件中的变量,否则可能导致无限循环(死循环)。

2) 从语法上讲,如果循环体只包含一条语句,那么可以省略花括号{};但为了代码的可读性,以及避免潜在的错误,建议始终使用花括号。

3) 循环条件的复杂性:while 循环的条件可以是任何有效的 C 表达式,比如一个数字、一个变量、一个函数调用、一个算术运算、一个关系运算,甚至,还能使用逻辑运算符拼接多个条件。例如:
while (x > 0 && y < 100) {
    //循环体
}

4) breakcontinue 语句:在循环体内,可以使用 break 语句立即退出循环,或使用 continue 语句跳过当前迭代的剩余部分,直接进入下一次迭代。