C多变量声明

时间:2012-03-01 15:17:26

标签: c

如果我写:

int a = 1;
int a = 2;

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

while(1) {
    int a = 1;
} 

没有编译时错误 - 差异是什么? while循环有自己的范围吗?

8 个答案:

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

出于同样的原因不会编译

编辑:这很疯狂,一分钟之内已经有五个答案了!

相关问题