在下面的代码中会发生什么

时间:2014-05-25 06:27:33

标签: c

#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++;
}
}

请解释两种情况下究竟发生了什么。我的意思是编译器在这些情况下如何工作

2 个答案:

答案 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!