C语言 难以理解“do...while”循环

30byixjq  于 2023-03-12  发布在  其他
关注(0)|答案(3)|浏览(158)
#include <cs50.h>
#include <stdio.h>

int main(void)
{
    // TODO: Prompt for start size
    int start_size;
    do
    {
        start_size = get_int("Start size (an integer at least greater than or equal to 9): ");
    }while (start_size < 9);

    // TODO: Prompt for end size
    int end_size;
    do
    {
        end_size = get_int("End size (an integer at least greater than or equal to start size): ");
    }while (end_size < start_size);

    // TODO: Calculate number of years until we reach threshold
    int years = 0;
    int n = start_size;
    do
    {
        n = n + (n / 3) - (n / 4);
        years++;
    }while (n < end_size);

    // TODO: Print number of years
    printf("Years: %i\n", years);
}

这是来自CS50实验室1。我的代码可以很好地处理所有测试,直到我们有相同的开始和结束大小。
显然,如果我们有相同的开始和结束大小,我们应该得到“Years:0”,因为只有当开始大小小于结束大小时,我们才应该运行do-while循环。但是当我们运行具有相同开始大小和结束大小的代码时,我们得到“Years:1”.为什么?谢谢!

kognpnkq

kognpnkq1#

...只有当开始大小小于结束大小时,我们才应该运行do-while循环。
不,do … while循环总是进入循环体,并且只在每次迭代结束时测试条件。
这就是为什么它是先写主体,后写条件的原因,所以它直观地显示主体先执行,然后测试条件。while循环是先写条件,然后测试条件,如果满足条件,就进入主体。
如果您希望先进行测试,请编写while循环,而不是do … while循环。

bf1o4zei

bf1o4zei2#

do..while循环至少执行一次,即使条件没有完成,因为条件在最后。我建议用while循环替换最后一个do..while循环。这样做可以保证如果条件没有完成,循环不会执行:

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    // TODO: Prompt for start size
    int start_size;
    do
    {
        start_size = get_int("Start size (an integer at least greater than or equal to 9): ");
    }while (start_size < 9);

    // TODO: Prompt for end size
    int end_size;
    do
    {
        end_size = get_int("End size (an integer at least greater than or equal to start size): ");
    }while (end_size < start_size);

    // TODO: Calculate number of years until we reach threshold
    int years = 0;
    int n = start_size;
    while (n < end_size)
    {
        n = n + (n / 3) - (n / 4);
        years++;
    }

    // TODO: Print number of years
    printf("Years: %i\n", years);
}

参考:https://www.tutorialspoint.com/cprogramming/c_do_while_loop.htm"A do...while loop is similar to a while loop, except the fact that it is guaranteed to execute at least one time."

zc0qhyus

zc0qhyus3#

在这个do-while循环中

int years = 0;
int n = start_size;
do
{
    n = n + (n / 3) - (n / 4);
    years++;
}while (n < end_size);

变量years在循环的第一次迭代中至少递增一次,这与在执行循环主体之后检查的循环条件无关。
所以变量years的值总是大于0
尝试将do-while循环更改为while循环,例如

while (n < end_size)
{
    n = n + (n / 3) - (n / 4);
    years++;
}

在这种情况下,在循环体获得控制权之前,将检查循环的条件。
while循环和do-while循环之间的区别在于do-while循环的主体总是在最初获得控制权,因为循环的条件是在执行循环的主体之后检查的。

相关问题