为什么从循环中重新声明C变量不会影响循环?

时间:2018-05-03 10:33:52

标签: c for-loop scope

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

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

我猜想,当我们重新声明i时,在i - 循环中评估for时,它会在第一个循环后停止循环。这就像我们刚刚重新分配i = 10;一样。但是,就好像正在创建一个新变量,但循环仍然使用前一个变量。这是怎么发生的?

4 个答案:

答案 0 :(得分:3)

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

使用我刚才所说的,我们看到你通过说int i = 10;重新初始化我。这意味着你在这个范围内创建了一个名为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;
}

答案 1 :(得分:1)

内部变量i的范围与for()中创建的范围不同。只要内部i有效,for变量就会被阴影化,并且无法访问。

答案 2 :(得分:0)

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

#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

答案 3 :(得分:0)

因为循环变量属于外部作用域中的(并且仅在代码中进行评估)。

它可以帮助想到经典的&#34; for-to-while&#34;变换,基本上说明了

for(A; B; C)
  D

可以转换为:

{
  A
  while(B)
  {
    D
    C
  }
}

希望这清楚地表明for i位于最外层范围内,因此不受内部影响(影响外部)。