大括号之间的代码和变量值的变化

时间:2014-02-23 19:18:20

标签: c printf curly-braces

int main(void) {
    int i = 2, k = 3, a;
    i++;
    ++k;
    {
        int i = 0;
        i = k++;
        printf("%d,%d,", i, k);
    }
    printf("%d,%d", i, k);
    getchar();
    return 0;
}

为什么这段代码产生输出“4,5,3,5”为什么不是“4,5,4,5”?为什么当我通过f7键c ++跟踪代码时,它首先是printf然后是第二个printf()。所以根据这个变量值必须保持4,那么为什么它在第二个printf()函数中给出i变量3的值?

3 个答案:

答案 0 :(得分:2)

第二个printf没有“看到”i声明为int i =0;,因为i位于由花括号创建的另一个范围内。

因此,第二个printf获取第一个i,它被声明(和定义)为int i =2,并在下一行中增加到3 {{1} }}

顺便说一句,代码缩进是你的朋友(也是我们的朋友:)。

答案 1 :(得分:2)

因为花括号分隔块,而C变量是块的本地。

因此第二个i对于内部块是本地的,并且与函数main的第一个main(){ int i =2,k=3,a; i++; // i = 3 ++k; // k = 4 { int i =0; // Lets call it i', then i' = 0 (it is different to i) i=k++; // i' = k = 4, then increment k so k = 5 printf("%d,%d,",i,k); // Prints i', k: "4,5," } printf("%d,%d",i,k); // Prints i, k: "3,5" getch(); } 不同。

请查看代码的评论版:

{{1}}

答案 2 :(得分:1)

C中的大括号定义块范围。因此,花括号分隔的块中的i与其外部的// main should return int. void type should be explicit in the parameter list int main(void) { int i = 2, k = 3, a; i++; // i is 3 ++k; // k is 4 { // block scope starts int i = 0; // not the same as the previous i i = k++; // block level i is 4 as k is 4 printf("%d, %d", i, k); // prints 4, 5 } // block scope ends printf("%d, %d", i, k); // prints 3, 5 getchar(); // getch is nonstandard. use getchar instead } 不同。我正在调整你的代码并在有用的地方添加评论。

{{1}}