【问题标题】:code between curly brackets and change in values of variables大括号之间的代码和变量值的变化
【发布时间】:2014-02-23 19:18:20
【问题描述】:
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呢?

【问题讨论】:

  • 范围,范围,范围,范围,...
  • i 在花括号中声明不是在 main 范围内声明的 i。您可以将它们视为i1i2
  • 这意味着i在main函数和花括号中,在这两种情况下,i的值都存储在不同内存地址的不同内存位置?
  • @AndroidDeveloper 是的,它们都位于堆栈的不同位置。 (如果你想让某人用@标记他,就像我对你做的那样,所以他会收到通知。否则,他很容易错过你在和他说话,他没有收到任何通知。)

标签: c printf curly-braces


【解决方案1】:

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

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

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

【讨论】:

  • 代码缩进意味着以正确的方式编写代码,意味着给适当的制表符空间并添加 cmets 等或其他任何东西?
  • @AndroidDeveloper 表示给予适当的制表符空间,让代码更具可读性。请注意人们如何很好地编辑您的帖子,现在好多了。 More reading.
【解决方案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();
}

【讨论】:

    【解决方案3】:

    C 中的花括号定义块范围。因此,由花括号分隔的块中的i 与它外面的不同。我正在稍微调整您的代码并在有帮助的地方添加 cmets。

    // 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
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多