for循环外部和内部的变量初始化之间的差异

时间:2012-06-09 17:13:45

标签: c variables for-loop

我编写了一个程序来打印出所有数字,其二进制模式在1到1993之间是对称的(例如:1001001,1010101)。我犯了一个错误,我发现了它。但是,还有一些我无法理解的细节。

正确的代码:

#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”在for循环之外的“k = 0”时不能增加到6,并且循环将一次又一次地重复。

2 个答案:

答案 0 :(得分:3)

你的while循环增加k。因此,在while循环中使用它之前,必须将其设置为0.如果不这样做,则从先前的计算中得到一个旧值。

答案 1 :(得分:2)

在“错误代码”中,k变量在迭代之间不会重置为0。然而,它会随着while循环的每次迭代而增加。在某些时候它会打破二进制[11]数组的上限,然后是“二进制[k ++] = n%2;”语句将开始覆盖堆栈上的其他变量,包括变量“i”。在这种情况下,会发生不可预测的事情。

如果你单步执行“错误的代码”,我相信你能够验证当i = 6时会发生这种情况。