为什么数据类型为unsigned int时无限循环?
下面的代码运行得很完美。给出正确的输出但是,当我将变量的符号从signed更改为unsigned时,程序会运行到无限循环中。 该程序是找到整数的阶乘。 在我知道unsigned int的模块化行为的任何地方,任何变量的值都不会消极。
#include 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=0;--i) printf("%d",a[i]); printf("\n"); } return 0; }
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
while (value-- > 0)
也可以,因为value
可以是0
,但不能< 0
。
还有,没有unsigned int
整数溢出,所以循环将是无限的而不会导致未定义的行为, 这个答案解释了当你将1
加到最大值时会发生什么,如果你从最小值中减去一个,那么我就是确定你可以“ 猜测 ”从同一个答案中会发生什么。
问题是,
for(i=count-1;i>=0;--i)
如果i
没有签名,将永远不会退出。 因为i
是无符号的,所以它总是大于或等于零,因此循环不能结束。
正如其他答案已经指出的那样,循环
for(i=count-1;i>=0;--i)
如果i
是无符号的,则是无限循环。 它可以用不同的forms重写
for (i = count - 1; i != -1; --i)
这将适用于签名和未签名的i
。 但是,有些人可能会发现它的可读性低于原始版本。