2015-05-23 55 views
0

下面的代碼完美運行。給出正確的輸出,但是當我將變量的符號從signed變爲unsigned時,程序運行到無限循環。 該程序是要找到整數的階乘。 任何變量的值在任何地方都不爲負 我知道unsigned int的模塊行爲。爲什麼數據類型爲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; 
} 

回答

1

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最大值,如果從最低值減去一個,那麼會發生什麼情況的說明我相信你可以「猜想」從相同的答案會發生什麼。

+0

我想你的意思是說'i> = 0'是成立的。 – Jens

+0

'(i = 0)> 0 == false'問題出在for循環測試'i> = 0'。 – datenwolf

+0

@Jens對,在某個點可能是'0',所以'i> 0'並不總是對的。 –

6

的問題是,

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

永遠不會退出,如果i是無符號。由於i未簽名,因此它總是大於或等於零,因此循環無法結束。

0

至於其他的答案已經指出,循環

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

是一個無限循環,如果i是無符號。它可以以不同的形式被改寫爲

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

如用於簽名和未簽名i將正常工作。然而,有些人可能會發現它比原來的可讀性差。