首页 > 编程笔记 > C++笔记 阅读:11

C++ while和do while循环用法详解(新手必看)

在自然语言中,我们用“只要……就一直……”这样的句式来表达在某个条件下某个动作循环多次发生的现象,比如:
与之对应地,在 C++ 中,我们用 while 循环结构来表达这种循环现象。其语法格式如下:
while(条件表达式)
{
    循环体语句;
}
在条件表达式中,我们对某个条件进行判断,得到表示条件成立与否的 true 或者 false 值,以此来表达这个循环是在“某个条件”下进行的。

while 结构中的循环体语句表示会被循环执行的动作。例如,我们将“只要油箱中的当前油量小于油箱容量 100 升,就一直往油箱中加油”这个循环现象用 while 结构表达出来就是:
// 当前油量
int nL = 0;
// ...
// 循环条件:当前油量小于油箱容积
while(nL < 100)
{
    nL += 1;  // 循环动作:往油箱中加油
}
在执行时,while 语句首先会计算条件表达式(nL < 100)的值,也就是判断循环条件(当前油量小于油箱容量 100 升)是否满足。如果其值为 true,表示循环条件满足,则进入循环执行循环体内的语句,完成循环动作(往油箱中加油);反之,则表示循环条件不再满足,从而直接结束整个 while 语句的执行。

当循环体语句执行完一次后,会再次计算条件表达式的值,判断循环条件是否仍然满足。如果满足,则继续进入循环执行循环体语句,开始第二次循环。如此不断循环往复,直到条件表达式的值为 false,循环条件不再满足,整个循环才结束。

读者可以把 while 理解成自然语言中的“只要”,即只要循环条件满足,就不断执行循环体语句。当循环条件不再满足时,就结束 while 循环语句。

while 循环语句的执行流程如下图所示。


图 1 while循环的执行流程

单步调试执行程序,查看代码的执行过程

while 循环语句的执行过程比之前介绍的 if 条件语句复杂得多,再加上后面我们将要学习的 breakcontinue 对执行过程的控制,使得 while 循环语句的执行过程更加复杂。稍不留意,就可能导致代码的实际执行过程与我们的设计不符,从而使程序执行得到错误的结果。

在这种情况下,我们可以利用 Visual Studio 提供的单步调试运行功能,查看 while 循环语句真实的执行过程,从而找到与设计预期不符的地方,进而改正错误,使程序按照正确的过程执行,得到正确的执行结果。

所谓单步调试执行,就是在调试状态下,按照程序的执行流程,逐条地依次执行每一条语句。在这个过程中,我们可以清楚地看到程序的执行过程——哪一条语句先执行,哪一条语句后执行,哪一条语句被跳过而没有执行。以此判断代码的执行过程是否与设计预期相符。

关于如何用 VS 单步调试程序,读者可猛击《C语言调试教程(非常详细)》一章系统学习。

C++ do while循环

前面介绍的 while 语句表达的“只要……就一直……”循环现象,是“先判断循环条件后执行循环动作”。然而在现实世界中,还有另一类循环现象。例如:
这类循环现象刚好与 while 语句表达的循环现象相反,总是先执行循环动作(如辛勤工作、输入数据),然后再判断循环条件(如我还活着,输入不为 0)。在自然语言中,我们可以用“一直……只要……”这样的句式来表达这种现象,正好是“只要……就一直……”的倒置。

对应地,在 C++ 中,我们通过将 while 语句倒置形成 do while 语句来表达这种循环现象。其语法格式如下:
do
{
    循环体语句;
}
while (条件表达式);
在执行时,do while 循环语句首先会执行一次循环体语句,然后利用条件表达式对循环条件进行判断。如果条件表达式的值为 true,则意味着循环条件仍然满足,循环体语句会再执行,开始下一次循环;反之,则意味着循环条件不再满足,直接结束整个循环。

do while 循环语句的执行流程如下图所示。


图 2 do while 循环结构的执行流程

下面来看一个实际的例子。在生活中,精打细算的妈妈们总是乐于统计每月的收支情况。用自然语言描述这一统计过程,可以是:

持续输入收支数目,并将它们累加到总收支中,直到没有更多的收支数目。

因此,“只要还有剩余的收支数目”就构成了 do while 循环的条件。我们将输入的收支数目设为 0 来表示没有更多的收支数目,换句话说,循环条件变为“当收支数目不为 0 时”。

“输入收支数目并将其累加到总收支总”就是这个 do while 循环要反复执行的动作。这是一个典型的“一直……只要……”循环现象。用 do…while 循环结构将其表达出来,示例代码如下:
// 每月收支统计程序
#include <iostream>
using namespace std;

int main()
{
    // 输出用户提示
    cout << "======每月收支统计程序======" << endl;
    cout << "请输入你本月的收入(正数)和支出(负数),0 表示输入结束。" << endl;

    // 收支数目
    int nInput = 0;
    // 收支总数
    int nTotal = 0;
    // 第一次循环,无条件执行循环动作
    // 其后的循环,在循环条件满足的情况下才能执行
    do
    {
        // 接受用户输入的收支数目并保存到 nInput
        cin >> nInput;
        // 对收支进行统计,将其和加到收支总数 nTotal 中
        nTotal += nInput;
    } while (0 != nInput);  // 对循环条件进行判断,以决定是否进行下一次循环

    // 输出统计结果
    cout << "你本月的结余是:" << nTotal << endl;

    return 0;
}
在执行时,do while 循环首先无条件执行一次循环体,然后再进行条件判断while(0!=nInput),即判断收支数目 nInput 是否为 0(判断循环条件是否依然满足),以决定是否进入下一次循环。这时的 nInput 已经是用户第一次输入的收支数目了。如果为 0,则表示后面没有收支数据了,0!=nInput 的值为 false,循环条件不再满足,直接结束整个 do while 循环。反之,则继续进行下一次循环,接受用户输入并将其累加到总收支中,然后再次判断循环条件是否依然满足,以决定是否进行下一次循环。这个过程会不断循环往复,直到用户输入 nInput 为 0,循环条件不再满足为止。

整个过程只需要输入各个收支数目,程序会循环接收这些数据并进行累加统计,最终得到结果。这比使用计算器省事多了。赶紧把这个统计程序献给老妈吧,肯定会得到老妈的一番奖赏。

C++ while和do while的区别

while 和 do while 都是用来表达循环现象的结构,且很多时候,两者可以相互转换。

while 和 do while 的区别在于,while 语句是先判断循环条件后执行循环动作,而 do while 语句则是先执行循环动作后判断循环条件。

这意味着,do while 语句的第一次循环可以无条件地执行,因此更加适合那些第一次循环没有初始条件限制的循环现象。例如在收支统计程序中,第一次输入收支数目时,任何时候、任何情况下都可以,没有初始条件限制。

而 while 语句的每一次循环动作都要在循环条件满足的前提下执行,所以更适合表达哪些每次循环都有前提条件的循环现象。例如,在给汽车加油时,每次我们都需要先判断油箱是否已满,无论是第一次还是最后一次。

相关文章