c ++代码神奇地将1加到输出中

时间:2013-12-15 07:03:58

标签: c++ c output

所以我无法弄清楚这一点。 (显然)

基本上,变量计数在开头声明,然后仅在一个地方修改或递增。预期的最终计数为78682。当count等于,我将打印出字符串“ok”。当count增加到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;
}

1 个答案:

答案 0 :(得分: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,你应该看到你的计算机超出界限。)