2012-06-09 90 views
1

我寫了一個程序來打印出所有數字,其二進制模式是對稱的(例如:1001001,1010101)在1到1993之間。我犯了一個錯誤,我發現了它。但是,有一些細節我還不明白。變量初始化外部和for循環之間的區別

正確的代碼:

#include <stdio.h> 
main() { 
    int binary[11] = {0}; 
    int i, n, j, k; 
    for(i = 1; i <= 1993; i++) { 
     n = i; k = 0; 
     while(n != 0) { 
      binary[k++] = n%2 ; 
      n = n/2; 
     } 
     for(j = 0; j < k; j++) { 
      if(binary[j] != binary[k-j-1]) 
      break; 
     } 
     if(j == k) { 
      printf("%d ", i); 
      for(j = 0; j < k; j++) 
       printf("%d", binary[j]); 
      printf("\n"); 
     } 
    } 
} 

的錯誤代碼:

#include <stdio.h> 
main() { 
    int binary[11] = {0}; 
    int i, n, j, k = 0; /* I have found a mistake here, k=0 should inside the for loop */  
    for(i = 1; i <= 1993; i++) { 
     n = i; 
     while(n != 0) { 
      binary[k++] = n%2 ; 
      n = n/2; 
     } 
     for(j = 0; j < k; j++) { 
      if(binary[j] != binary[k-j-1]) 
      break; 
     } 
     if(j == k) { 
      printf("%d ", i); 
      for(j = 0; j < k; j++) 
       printf("%d", binary[j]); 
      printf("\n"); 
     } 
    } 
} 

我只是不明白,爲什麼變量 「i」 不能增加至6時, 「K = 0」 外for循環,並且循環將一遍又一遍地重複。

+3

您應該使用調試器來瀏覽這兩個程序,以觀察它們爲什麼會像他們那樣工作。 –

回答

2

在「錯誤代碼」中,k變量將在迭代之間不能重置爲0。然而,它會隨着while循環的每次迭代而增加。在某個點它會打破二進制[11]數組的上界,然後是「二進制[k ++] = n%2;」語句將開始覆蓋堆棧上的其他變量,包括變量「i」。在這種情況下,不可預知的事情會發生。

如果你逐步通過「錯誤的代碼」,我相信你可以驗證這發生在我= 6時。

+0

「覆蓋其他變量」,我認爲這是關鍵。 – Yuu

+0

C語言不能幫助你保持界限,所以增加/減少數組索引是錯誤的常見來源。 –

+0

非常感謝! – Yuu

3

你的while循環增加了k。因此,在while循環中使用它之前,你必須將它設置爲0.如果你不這樣做,你有一箇舊的計算值。