2015-11-21 205 views
-3

当在程序中声明int i;语句时,它显示错误,但在int i;被写入for循环运行两次时,它不显示任何错误。c循环和外部循环中的变量重新声明?

#include<stdio.h>//code 1 showing error 
int main() 
{ 
    int i; 
    int i; 
    return 0; 
} 
#include<stdio.h>//code 2 no error 
int main() 
{ 
    for(int j=1;j<=2;j++) 
     int i; 
    return 0; 
} 
+0

请添加代码! –

+0

for循环运行两次吧 –

回答

0

为了了解你的问题,也被称为变量的范围,让我们来看看下面的示例程序:

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int I = -1; 
    for (int I = 0; I < 3; I++) { 
     printf("%d\n", I); 
    } 
    printf("%d\n", I); 
    { 
     int I = 200; 
     printf("%d\n", I); 
    } 
    return 0; 
} 

正如你可以看到我声明的变量我三次。

当宣布进入循环的结果将是印刷以下值:

0 
1 
2 

后for循环,当我现在再打印一次我变我指的是外面的for循环声明的变量,第一个我声明,使结果将是:

-1

现在,如果我打开与花括号一个新的范围,我宣布一个新的变量名称相同,但具有不同的价值,我必须得到:

我希望我对变量的作用域描述现在很清楚

+0

谢谢你的好解释 –

1

这是因为声明的变量的作用域只有在那里你已宣布了她的代码块中。在该区块外面没有看到。

我已经看到了你的代码now.It很清楚,在1.代码中你声明了两个同名的int,这是不允许的,在2.代码中声明了两个int,并且名称不同,所以它很好。

+0

你明白我说的吗? – PeMaCN

+0

抱歉说这个,但我不明白你的观点。 –

+0

你不能有2个变量具有相同的名称(这是错误发生在第一个代码中的方式)。第二个代码是好的,因为你没有声明2个变量具有相同的名称(你已经声明int j为第一个,int i为第二个变量)。这是我可以对你说的。明确? – PeMaCN

0

第一main试图定义具有相同标识符的两个变量。这显然是被禁止的,并导致编译错误。

第二个main包含for -loop。 for -loop 引入了一个新的范围,如果没有添加大括号,只包含下一个语句或定义(即int i;)。
i被分配和被重新分配每次迭代,所以它真的只存在一次。所有的i有史以来都在不同的范围。因此没有命名冲突。


如果在外部范围的变量从内范围(即,main功能范围),一个在一个内部范围(即,for -loop的范围),可变隐藏来自外部作用域的一个,因此使外部作用域变量不可访问。

的C11标准说,§6.2.1.4:

在内侧范围内,所述标识符指定在内部范围声明 实体;在外部范围内声明的实体在内部范围内是隐藏 (并且不可见)