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

时间:2015-05-23 16:25:45

标签: c

下面的代码运行完美。给出了正确的输出,但是,当我将变量的符号从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 个答案:

答案 0 :(得分:6)

问题是,

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

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

答案 1 :(得分:2)

unsigned int永远不会消极,因此i >= 0始终拥有true,这意味着像

这样的循环
unsigned int value;

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

有效一个inifinte循环,以及你的for (i = count - 1 ; i >= 0 ; --i)

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

您应该注意,虽然>=在这方面没有任何区别,但

unsigned int value;

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

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

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

答案 2 :(得分:1)

正如其他答案已经提到的那样,循环

for(i=count-1;i>=0;--i)
如果i未签名,则

是无限循环。它可以用不同的形式重写为

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

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