问题描述
我编写了一个简单的程序(包含在下面),该程序将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;
}
但是该程序在运行时,在接受输入并将其存储在num
变量中后不返回任何内容。它也没有崩溃/退出。 while
循环的主体没有任何问题,因此我怀疑是无限循环,并编写了一个小程序只是为了从类似的while循环中打印出count
变量
#include <stdio.h>
int main(void)
{
unsigned short count;
count = 4;
while (count >= 0) {
printf("%hu",count);
count--;
}
return 0;
}
...300653005530045300353002530015300052999529985299752996529955299452993529925299152990529895298852987529865298552984529835298252981529805297952978529775297652975529745297352972529715297052969529685296752966529655296452963529625296152960529595295852957529565295552954529535295252951529^C
我的假设是罪魁祸首是count
的{{1}}的{{1}}。因为这意味着它不能递减到0以下,所以当type
已经unsigned short
时,最后一个count--
将其值设置为count
,因此可以永远不要终止循环。我说得对吗?
解决方法
您的假设是正确的:作为变量unsigned
,它永远不会被评估为负数。
在您的情况下,如果在count
变量等于0时递减,则将得到值65535(USHRT_MAX
)。
简单的解决方案是摆脱unsigned
关键字:
short count = 4;
此解决方案最适合问题中提供的基本代码。无论如何,由于在“真实代码”中可能不会发生改变计数器类型的选择,因此可以在递减前检查count == 0
(这是@ Elijan9的信用):
while (true)
{
/* ...; */
if (count == 0)
break;
--count;
}