首页 文章

为什么数据类型为unsigned int时无限循环?

提问于
浏览
0

下面的代码运行得很完美 . 给出正确的输出但是,当我将变量的符号从signed更改为unsigned时,程序会运行到无限循环中 . 该程序是找到整数的阶乘 . 在我知道unsigned int的模块化行为的任何地方,任何变量的值都不会消极 .

#include<stdio.h>

int main(void)
{
    int a[200], i,index, number, next, count, temp, test, x;

    scanf(" %d", &test);

    while(test--)
    {
        scanf(" %d", &number);
        a[0]=1;
        count=1;    //1 digit
        for(next=2;next<=number;++next)
        {
            index=0;temp=0;
            for(i=0;i<count;++i)
            {
                x=a[index]*next+temp;
                a[index]=x%10;
                temp=x/10;
                ++index;
            }
            while(temp!=0)
            {
                a[count++]=temp%10;
                temp=temp/10;
            }
        }
        for(i=count-1;i>=0;--i)
        printf("%d",a[i]);
        printf("\n");
    }
    return 0;
}

3 回答

  • 1

    问题是,

    for(i=count-1;i>=0;--i)
    

    如果 i 未签名,将永远不会退出 . 因为 i 是无符号的,所以它总是大于或等于零,因此循环不能结束 .

  • 6

    正如其他答案已经指出的那样,循环

    for(i=count-1;i>=0;--i)
    

    如果 i 是无符号的,则是无限循环 . 它可以用不同的形式重写

    for (i = count - 1; i != -1; --i)
    

    这将适用于签名和未签名的 i . 但是,有些人可能会发现它的可读性低于原始版本 .

  • 2

    unsigned int 永远不会是负数,所以 i >= 0 始终保持 true ,这意味着像一个循环

    unsigned int value;
    
    value = 10;
    while (value-- >= 0) {}
    

    实际上是一个inifinte循环,以及你的 for (i = count - 1 ; i >= 0 ; --i) .

    编译器会对此发出警告,因此如果编译代码将正确的标志传递给编译器,它应该告诉您条件将始终为true .

    你应该注意到虽然 >= 在这方面没有区别,

    unsigned int value;
    
    value = 10;
    while (value-- != 0) {}
    

    确实有效,因为 while (value-- > 0) 也可以,因为 value 可以 0 ,但它不能 < 0 .

    还有,没有 unsigned int 整数溢出,所以循环将是无限的而不会导致未定义的行为,this answer解释了当你将 1 添加到最大值时会发生什么,如果你从最小值中减去一个,那么我相信你可以“猜测”同一个答案会发生什么 .

相关问题