如果我写:
int a = 1;
int a = 2;
我得到编译时错误,但是如果我写:
while(1) {
int a = 1;
}
没有编译时错误 - 差异是什么? while循环有自己的范围吗?
答案 0 :(得分: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!
答案 1 :(得分:4)
是的,循环的每次迭代都有自己的范围。当迭代到达循环结束时,内部定义的变量就会消失。
答案 2 :(得分:3)
是的,循环的大括号打开一个新范围,内部范围中的所有变量隐藏变量,并且外部范围内的名称相同。
答案 3 :(得分:2)
你猜对了!
C允许您重新定义子范围中的标识符。因此,while块是一个不同的范围,允许您隐藏变量a
- 当然,只在该子块内有效。如果您不了解这种行为,可能会导致很多问题。
答案 4 :(得分:1)
是{}
定义新范围。
答案 5 :(得分:1)
是的,循环块本身就是一个范围。当到达循环结束时,a
超出范围,并且可以为下一次迭代声明新的a
。
答案 6 :(得分:1)
区别在于范围。范围由花括号 - {}决定。在第一种情况下,两个变量共享相同的范围 - 这就是您收到错误的原因。在第二种情况下,您定义local(对于while的范围)变量。在循环的每次迭代中创建一个新变量。这是完全有效的,这就是为什么你不会得到错误。 如果您不清楚这一点,我建议您进一步研究,这是一个好的开始 - http://crasseux.com/books/ctutorial/Scope.html
答案 7 :(得分:1)
执行int a = 1;
后,保留{ }
块,删除该块中声明的每个变量。当您正在进行一段时间(真实)循环时,您将输入另一个{ }
块,但新块将不会“意识到您之前创建了'a'变量...因为它已被扫除!” / p>
例如:
{
int a = 1;
}
a = 2;
出于同样的原因不会编译
编辑:这很疯狂,一分钟之内已经有五个答案了!