#include<stdio.h>
main()
{
int i;
for(i=0;i<=5;i++)
{
int i=10;
printf("%d\n",i);
i++;
}
}
为什么它给出答案10 10 10 10 10 10
相反,如果我们使用此代码,则会产生问题。
#include<stdio.h>
main()
{
for(int i=0;i<=5;i++)
{
int i=10;
printf("%d\n",i);
i++;
}
}
请解释两种情况下究竟发生了什么。我的意思是编译器在这些情况下如何工作
答案 0 :(得分:3)
在第一种情况下,
#include<stdio.h>
int main()
{
int i;
for(i=0;i<=5;i++)
{
int i=10; // This shadows the previous i
printf("%d\n",i);
i++;
}
}
在第二种情况下,
#include<stdio.h>
int main()
{
for(int i=0;i<=5;i++)
{
int i=10; // This is a problem because the previous i
// is in the same scope as this i.
printf("%d\n",i);
i++;
}
}
答案 1 :(得分:0)
在第一个代码块中,实际上有两个范围,每个范围中声明的i
是不同的变量。
考虑这个等效代码,使用不同的变量名来避免/显示与第二个声明混淆第一个的混淆。
// outer scope
int i;
for(i=0;i<=5;i++) // loops 5 times, only increments i here
{
// inner scope
int J=10; // always assigns 10 to J before print
printf("%d\n",J);
J++; // no effect on i
}
对于第二种情况,在for
循环初始化部分中声明的变量声明在与for循环的 body 相同的范围内:
// Same as declaring i in the inner scope ..
for(int i=0;i<=5;i++)
{
// .. so this is a compiler error because i is
// already declared this in scope.
int i=10;
}
也就是说,编译将第二种情况视为类似..
int i=0;
int i=10; // but this redeclaration is invalid
..和KABOOM!