我弄清楚为什么while循环是无限的吗?

问题描述

我编写了一个简单的程序(包含在下面),该程序将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;
}

这确实是一个infinite循环...输出的一部分是:

...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;
 }