#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”.为什么?谢谢!
3条答案
按热度按时间kognpnkq1#
...只有当开始大小小于结束大小时,我们才应该运行do-while循环。
不,
do … while
循环总是进入循环体,并且只在每次迭代结束时测试条件。这就是为什么它是先写主体,后写条件的原因,所以它直观地显示主体先执行,然后测试条件。
while
循环是先写条件,然后测试条件,如果满足条件,就进入主体。如果您希望先进行测试,请编写
while
循环,而不是do … while
循环。bf1o4zei2#
do..while循环至少执行一次,即使条件没有完成,因为条件在最后。我建议用while循环替换最后一个do..while循环。这样做可以保证如果条件没有完成,循环不会执行:
参考: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."
zc0qhyus3#
在这个do-while循环中
变量
years
在循环的第一次迭代中至少递增一次,这与在执行循环主体之后检查的循环条件无关。所以变量
years
的值总是大于0
。尝试将do-while循环更改为while循环,例如
在这种情况下,在循环体获得控制权之前,将检查循环的条件。
while循环和do-while循环之间的区别在于do-while循环的主体总是在最初获得控制权,因为循环的条件是在执行循环的主体之后检查的。