繁体   English   中英

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

[英]code between curly brackets and change in values of variables

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的值呢?

第二个printf没有“看到” i声明为int i =0; ,因为i在您的花括号创建的另一个作用域中。

因此,第二个printf使用第一个i ,该i被声明(并定义为) int i =2并在下一行用i++递增为3

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

因为花括号分隔了块,并且在C语言中变量是块的局部变量。

因此,第二个i是内部块的局部,而不同于第一个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();
}

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
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM