在下面的代码中,变量i已在 for 循环中全局和本地声明。由于局部变量的高优先级,我将使用值10初始化。但是在第一次出现循环时,由于for循环中的i ++,i的值将变为11,所以它应该在第一个实例之后不退出循环吗?
#include<stdio.h>
int main(){
int i;
for(i=0;i<5;i++){
int i=10;
printf(" %d",i);
i++;
}
return 0;
}
P.S:答案是10 10 10 10 10
答案 0 :(得分:4)
优先权不仅仅是初始化。循环体内的变量i
是来自外部的不同变量。它“遮蔽”外部i
,使其在循环体中无法访问。
循环控制语句在循环体之外。它的i
是外i
,对内i
没有任何影响对它有任何影响,因此它从0开始并计数到5.在每次循环迭代时,内部i
被重新初始化为10,那就是被打印的那个。
答案 1 :(得分:1)
它始终打印的原因是内部i
shadows外部i
。出于同样的原因,循环内的i++;
会增加内部i
,而不会增加用作i
循环计数器的for
。
但是在内部i
的范围结束后,控制循环的i
会增加,并且与循环内的i++;
无关。它完全独立于内部i
,因此循环运行5次。
GCC提供了一个警告这种阴影的选项:-Wshadow
。
答案 2 :(得分:1)
另一个答案是因为到目前为止缺少一个方面。如果您稍微更改了代码:
#include<stdio.h>
int main(){
int i;
for(i=0;i<5;i++){
static int i=10;
printf(" %d",i);
i++;
}
return 0;
}
你会得到更多&#34;预期&#34;结果:
10 11 12 13 14
块中的一个变量在块(读取:花括号对)之后停止存在(并且在执行for
的控制语句的每一步之后都留在这里...)所以您的原始代码,每次都会获得一个新的内部i
。声明内部i
static
仍然没有改变范围(它只在循环体内可见),但使变量存活并且仍然可用时再次输入相同的块。
答案 3 :(得分:0)
是的,答案是对的。
当循环迭代5
次并且每次迭代i
内部循环被设置为10
而外部循环被内部一个所掩盖。在i=10
打印其值后,输出5
次10
。