解释给定代码的输出

时间:2015-07-18 13:57:22

标签: c

在下面的代码中,变量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

4 个答案:

答案 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打印其值后,输出510