我是否正确地弄清楚为什么这个 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

我的假设是 counttypeunsigned 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;
 }