2012-03-01 106 views
3

如果我写:碳多重变量声明

int a = 1; 
int a = 2; 

我得到一个编译时错误,但是如果我写:

while(1) { 
    int a = 1; 
} 

没有编译时错误 - 什么区别? while循环有其自己的范围或什么?

+1

@Benoit:局部变量可以在C89中的块的开始处以及C99中的任何位置声明。所以上面的第二个代码是有效的C89和C99。 – interjay 2012-03-01 15:26:15

+0

我很高兴我注意到了这一点 - 行为不像我最初想象的那样,肯定会成为错误的来源。感谢您的迅速和简洁的解释 – bph 2012-03-01 15:36:19

回答

4

在第二种情况下,您没有在同一范围中定义多个名称相同的变量。什么情况是这个

while(1) { //there is no variable a in this scope 
    int a = 1; //define a variable a at this point. 
} //variable a is no more 

在第一种情况下,然而,我们有

int a = 1; //define variable a; 

int a = 1; //variable a has been defined in this scope already, so error! 
4

是的,每次循环都有自己的范围。当迭代达到循环结束时,内部定义的变量消失。

3

是的,循环的大括号打开一个新的范围,内部范围内的所有变量隐藏与外部范围具有相同名称的变量。

2

你猜对了!

C允许您重新定义子范围中的标识符。因此,作为不同范围的while块允许您隐藏变量a - 当然,该变量只在该子块内有效。如果您不知道这种情况,会导致很多问题。

1

是的,循环块本身就是一个范围。当循环结束时,a超出范围,并且可以为下一次迭代声明新的a

1

区别在于范围。范围由大括号确定 - {}。在第一种情况下,两个变量共享相同的范围 - 这就是为什么你收到错误。在第二种情况下,您可以定义本地(对于while的范围)变量。循环的每次迭代都会创建一个新变量。这是完全有效的,这就是为什么你没有得到错误。 如果不清楚你我建议你研究它更多的,这里是一个良好的开端 - http://crasseux.com/books/ctutorial/Scope.html

1

你做int a = 1;后,你离开{ }块,除去在块中声明的变量每次。当你正在做一段时间(真正的)循环时,你会输入另一个{ }块,但是这个新块不会“知道”你之前创建了一个'a'变量......因为它被冲走了!

例如:

{ 
    int a = 1; 
} 
a = 2; 

不会编译出于同样的原因

编辑:这太疯狂了,一分钟内有已经有5个答案!

+0

它是完全疯了! – bph 2012-03-01 15:30:21