2013-12-15 18 views
1

所以我無法弄清楚這一點。 (顯然)C++代碼神奇地添加1到輸出

基本上變量數在開始時聲明,然後只在一個地方修改或增加。預計的最終數量是78682。當count等於那個時,我會打印出字符串「ok」。當計數增加到78683時,代碼檢查條件並打印字符串「not ok」。

它從不打印「not ok」,但在最後打印計數值時,它是78683!什麼時候C++增加了?

另一件事是,當下面的評論未註釋時,最終結果然後變成78682,雖然我只是不明白爲什麼。任何人? (順便說一句哦,代碼需要一分鐘運行....)

#include <stdio.h> 

int main(){ 
int count=0, sum=0; 

int length []={1,2,4,10,20,40,100,200}; 
int value [] ={200,100,50,20,10,5,2,1}; 
int tmp[8] ={0}; 

bool stop=false; 

while(!stop){ 
    sum=0; 
    for(int j=0,k=0; j<8; j++){ 
     sum+=value[j]*tmp[j]; 
     if(j==7){ 
      if(sum==200){ 
       count++; 
       if(count==73682) printf("ok\n"); 

       if(count==73683) printf("not ok\n"); 
      } 

      k=j; 
      tmp[k]++; 
      while(tmp[k]==length[k]+1){ 

       tmp[k]=0; 
       k--; 
       tmp[k]++; 

       if(tmp[0]==2) 
       { 
        //tmp[0]--; 
        stop=true; 
       } 
      } 

     } 
    } 
} 

printf("Total %d.", count); 
return 0; 
} 
+3

那不是'C++'。相當遙遠,我會說。不像它真的很重要,但仍然。 – luk32

+0

@ luk32用g ++編譯並運行它。它是C++。 – TurtleTread

+1

'printf'是* not * C++,因此這不是「純粹的」C++。 – ChiefTwoPencils

回答

3

在我的電腦我得到

ok 
Total 73682. 

都與註釋行與行註釋。因此我無法調試它。

但最可能的假設是,你得到錯誤結果的原因是超出邊界數組訪問。如果你寫tmp[anything]它可以在內存中的任何地方,包括存儲計數的地方。所以你需要檢查0 <= anything && anything < 8。你可以這樣訪問這裏:

while(tmp[k]==length[k]+1){ 

    tmp[k]=0; 
    k--; 

請加安全檢查,確保k >= 0

P.S.我加了檢查:

while(tmp[k]==length[k]+1){ 

      tmp[k]=0; 
      k--; 
      if(k < 0) printf("oops\n"); 

與行註釋掉我得到

ok 
oops 
Total 73682. 

與行註釋掉我得到

ok 
Total 73682. 

所以也許你已經在計劃中其他一些錯誤。對不起,找不到它。 (也知道程序假設你做什麼可以打印中間結果並檢查它們,但是如果你得到了73683,你應該看到你的計算機出現了越界訪問)。

+0

所以超出範圍的數組可能會隨着變量「count」(至少在我的電腦上)發生變化? – TurtleTread

+1

@campuswebber,是的,如果你寫了tmp [-anything]它可以是內存中的任何地方,包括存儲計數的地方。 – klm123

+0

這正是發生了什麼事。沒有評論,while循環最後一次運行,k得到-1。 tmp [k] ++,它計算++。謝謝。 – TurtleTread