如果我写:碳多重变量声明
int a = 1;
int a = 2;
我得到一个编译时错误,但是如果我写:
while(1) {
int a = 1;
}
没有编译时错误 - 什么区别? while循环有其自己的范围或什么?
如果我写:碳多重变量声明
int a = 1;
int a = 2;
我得到一个编译时错误,但是如果我写:
while(1) {
int a = 1;
}
没有编译时错误 - 什么区别? while循环有其自己的范围或什么?
在第二种情况下,您没有在同一范围中定义多个名称相同的变量。什么情况是这个
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!
是的,每次循环都有自己的范围。当迭代达到循环结束时,内部定义的变量消失。
是的,循环的大括号打开一个新的范围,内部范围内的所有变量隐藏与外部范围具有相同名称的变量。
你猜对了!
C允许您重新定义子范围中的标识符。因此,作为不同范围的while块允许您隐藏变量a
- 当然,该变量只在该子块内有效。如果您不知道这种情况,会导致很多问题。
是的{}
定义了一个新的范围。
是的,循环块本身就是一个范围。当循环结束时,a
超出范围,并且可以为下一次迭代声明新的a
。
区别在于范围。范围由大括号确定 - {}。在第一种情况下,两个变量共享相同的范围 - 这就是为什么你收到错误。在第二种情况下,您可以定义本地(对于while的范围)变量。循环的每次迭代都会创建一个新变量。这是完全有效的,这就是为什么你没有得到错误。 如果不清楚你我建议你研究它更多的,这里是一个良好的开端 - http://crasseux.com/books/ctutorial/Scope.html
你做int a = 1;
后,你离开{ }
块,除去在块中声明的变量每次。当你正在做一段时间(真正的)循环时,你会输入另一个{ }
块,但是这个新块不会“知道”你之前创建了一个'a'变量......因为它被冲走了!
例如:
{
int a = 1;
}
a = 2;
不会编译出于同样的原因
编辑:这太疯狂了,一分钟内有已经有5个答案!
它是完全疯了! – bph 2012-03-01 15:30:21
@Benoit:局部变量可以在C89中的块的开始处以及C99中的任何位置声明。所以上面的第二个代码是有效的C89和C99。 – interjay 2012-03-01 15:26:15
我很高兴我注意到了这一点 - 行为不像我最初想象的那样,肯定会成为错误的来源。感谢您的迅速和简洁的解释 – bph 2012-03-01 15:36:19