我是否正确地弄清楚为什么这个 while 循环是无限的?
Am I correct in figuring out why this while loop is infinite?
我写了一个简单的程序(包含在下面),它接受一个 5 位数,反转并打印它。
#include <stdio.h>
#include <limits.h>
#include <math.h>
int main(void)
{
unsigned short num, revnum, digit, count;
count = 4;
revnum = 0;
fprintf(stdout, "Enter a five digit number in range [0 - %hu]: ", USHRT_MAX);
fscanf(stdin, "%hu", &num);
while (count >= 0) {
digit = num % 10;
num = num / 10;
revnum += digit * pow(10, count);
count--;
}
fprintf(stdout, "The number with digits reversed is %hu.\n", revnum);
return 0;
}
然而,当 运行 时,程序不会 return 任何东西 post 获取输入并将其存储在 num
变量中。它也没有 crash/exit。 while
循环的主体没有任何问题,所以我怀疑是一个无限循环并编写了一个小程序只是为了从类似的 while 循环
中打印出 count
变量
#include <stdio.h>
int main(void)
{
unsigned short count;
count = 4;
while (count >= 0) {
printf("%hu", count);
count--;
}
return 0;
}
这确实是一个 infinite
循环...输出的一部分是:
...300653005530045300353002530015300052999529985299752996529955299452993529925299152990529895298852987529865298552984529835298252981529805297952978529775297652975529745297352972529715297052969529685296752966529655296452963529625296152960529595295852957529565295552954529535295252951529^C
我的假设是 count
的 type
是 unsigned short
的罪魁祸首。因为这意味着它不能递减到 0 以下,所以最终的 count--
when count
already == 0
将其值设置为 USHRT_MAX
因此永远不能终止循环。我说得对吗?
您的假设是正确的:作为您的变量 unsigned
它永远不会被评估为负数。
在您的例子中,如果您在 count
变量等于 0 时递减它,您将得到值 65535 (USHRT_MAX
)。
简单的解决方案是去掉 unsigned
关键字:
short count = 4;
这个解决方案最适合问题中提供的基本代码。无论如何,由于在“真实代码”中可能发生更改计数器类型不是一种选择,因此在递减之前检查 count == 0
可能是解决方案(归功于@Elijan9):
while (true)
{
/* ...; */
if (count == 0)
break;
--count;
}
我写了一个简单的程序(包含在下面),它接受一个 5 位数,反转并打印它。
#include <stdio.h>
#include <limits.h>
#include <math.h>
int main(void)
{
unsigned short num, revnum, digit, count;
count = 4;
revnum = 0;
fprintf(stdout, "Enter a five digit number in range [0 - %hu]: ", USHRT_MAX);
fscanf(stdin, "%hu", &num);
while (count >= 0) {
digit = num % 10;
num = num / 10;
revnum += digit * pow(10, count);
count--;
}
fprintf(stdout, "The number with digits reversed is %hu.\n", revnum);
return 0;
}
然而,当 运行 时,程序不会 return 任何东西 post 获取输入并将其存储在 num
变量中。它也没有 crash/exit。 while
循环的主体没有任何问题,所以我怀疑是一个无限循环并编写了一个小程序只是为了从类似的 while 循环
count
变量
#include <stdio.h>
int main(void)
{
unsigned short count;
count = 4;
while (count >= 0) {
printf("%hu", count);
count--;
}
return 0;
}
这确实是一个 infinite
循环...输出的一部分是:
...300653005530045300353002530015300052999529985299752996529955299452993529925299152990529895298852987529865298552984529835298252981529805297952978529775297652975529745297352972529715297052969529685296752966529655296452963529625296152960529595295852957529565295552954529535295252951529^C
我的假设是 count
的 type
是 unsigned short
的罪魁祸首。因为这意味着它不能递减到 0 以下,所以最终的 count--
when count
already == 0
将其值设置为 USHRT_MAX
因此永远不能终止循环。我说得对吗?
您的假设是正确的:作为您的变量 unsigned
它永远不会被评估为负数。
在您的例子中,如果您在 count
变量等于 0 时递减它,您将得到值 65535 (USHRT_MAX
)。
简单的解决方案是去掉 unsigned
关键字:
short count = 4;
这个解决方案最适合问题中提供的基本代码。无论如何,由于在“真实代码”中可能发生更改计数器类型不是一种选择,因此在递减之前检查 count == 0
可能是解决方案(归功于@Elijan9):
while (true)
{
/* ...; */
if (count == 0)
break;
--count;
}