来自这个question,为什么这个循环仍然运行5次?
for(int i = 0; i < 5; i++)
{
int i = 10;
printf("%d\n", i);
}
我猜想,当我们重新声明i
时,在i
- 循环中评估for
时,它会在第一个循环后停止循环。这就像我们刚刚重新分配i = 10;
一样。但是,就好像正在创建一个新变量,但循环仍然使用前一个变量。这是怎么发生的?
答案 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
位于最外层范围内,因此不受内部影响(影响外部)。