【问题标题】:Why does redeclaring the C variable from a loop not affect the loop? [duplicate]为什么从循环中重新声明 C 变量不会影响循环? [复制]
【发布时间】:2018-10-13 15:21:51
【问题描述】:

来自这个question,为什么这个循环仍然运行5次?

for(int i = 0; i < 5; i++)
{
    int i = 10;  
    printf("%d\n", i); 
}   

我猜想当我们重新声明i 时,当ifor 循环中被评估时,它会在第一个循环之后停止循环。就好像我们刚刚重新分配了i = 10;。但是,就好像正在创建一个新变量,但循环仍然使用前一个变量。这是如何以及为什么会发生的?

【问题讨论】:

  • i 是在循环范围内创建的。在你的情况下,它被放在堆栈上。在循环结束时,堆栈展开并被移除。然后,您再次开始循环并在堆栈上再次创建一个名为 i 的新变量。
  • 研究一下复制品:它都在里面。请注意,您提供的代码不是有效的 C++。

标签: c for-loop scope


【解决方案1】:

这是由于范围。每次使用大括号 {} 时,都会为程序生成一个新范围。一旦退出范围,在该范围中初始化的任何内容都将被删除,这对您来说是每个循环,当它存在时检查循环条件。

使用我刚才所说的,我们看到您正在通过说int i = 10; 重新初始化 i,这意味着您在此范围内创建了一个名为 i 的新变量,其值为 10。您只需编写 i = 10; 即可获得所需的结果,因为它首先会在变量的范围内查找,然后它将在上面的下一个范围内循环,并在您的 for 循环中找到它。

编辑:

进一步对此进行评论,这意味着您可以为多个变量使用相同的名称,只要它们位于彼此不同的范围内。像这样:

#include <stdio.h>
int main()
{
    int x = 10;
    printf("x = %d\n",x); //check x value equals 10

    for(int i = 0; i < 10; i ++)
    {
        int x = i;
        printf("x = %d\n",x); //a new variable, also called x, now outputs x = i;
    }

    printf("x = %d\n",x); //check x value returns to the original when scope is left
    return 0;
}

【讨论】:

    【解决方案2】:

    内部变量i 的作用域与for() 中创建的作用域不同。 for 变量会被隐藏,这样只要内部的i 有效,就无法访​​问。

    【讨论】:

      【解决方案3】:

      这应该给我们一个想法。循环内容执行完毕后,在下一次迭代中,循环内(大括号之间)声明的i超出范围,只有for()语句中声明的i在范围内。

      #include <stdio.h>
      
      int main() {
      
          for(int i = 0; printf("i = %d\n", i) && i < 5; i++)
          {
              int i = 10;  
              printf("%d\n", i); 
          }   
          return 0;
      }
      

      输出:

      i = 0
      10
      i = 1
      10
      i = 2
      10
      i = 3
      10
      i = 4
      10
      i = 5
      

      【讨论】:

        【解决方案4】:

        因为循环的变量属于(并且仅在您的代码中评估)外部范围。

        想想经典的“for-to-while”转换会有所帮助,它基本上说明了

        for(A; B; C)
          D
        

        可以转化为:

        {
          A
          while(B)
          {
            D
            C
          }
        }
        

        希望这可以清楚地表明fori 位于最外层范围内,因此不受内层影响(遮蔽了外层)。

        【讨论】:

          猜你喜欢
          • 2017-06-27
          • 1970-01-01
          • 2016-02-23
          • 2014-06-15
          • 2021-02-13
          • 2015-11-30
          • 1970-01-01
          • 2018-10-11
          • 1970-01-01
          相关资源
          最近更新 更多