2013-05-07 66 views
3

我很困惑,我为什么允许这样做(if语句是只显示范围):Objective-C的变量声明混乱

int i = 0; 
if(true) 
{ 
    float i = 1.1; 
} 

我有一个C#背景,这样的事情是不是允许。基本上,程序员重新声明变量'i',从而赋予'我'一个新的含义。任何洞察力将不胜感激。

谢谢!

回答

4

在C语言中(以及在扩展中,在Objective C中),它允许在内部作用域声明局部变量来隐藏外部作用域的变量。你可以摆脱if和写:决定针对

int i = 0; 
{ 
    // Here, the outer i becomes inaccessible 
    float i = 1.1; 
    { 
     int i = 2; 
     printf("%d", i); // 2 is printed 
    } 
} 

demo

C#标准,可能是因为它拥有的是一个错误的概率高,但C /目标C没有问题用它。

+0

我明白了。谢谢你的解释。它帮助明确了这一点。谢谢! – crizzwald 2013-05-07 15:11:49

+0

像往常一样:) – 2013-05-07 15:12:37

+1

@Amin下面说了什么 - 打开“隐藏的局部变量”警告让编译器barf在这个。强烈推荐。 – bbum 2013-05-07 15:44:07

1

你是部分正确的,是的,它给i一个新的含义,但它不是重新声明变量。这是另一个变量。但由于标识符相同,当前范围将“隐藏”前一个,因此在该块内使用i就是指浮动。

1

你没有重新定义i,多达shadowingi。这仅在i的声明处于不同级别的范围时才有效。 C#允许使用阴影,但不适用于if语句/ switch语句,而C/C++/Objective-C允许使用这种阴影。

在内部i超出范围之后,标识符i将再次参考iint版本。所以它不会改变原来的i所指的。隐藏变量通常是不是你想做的事情(除非你小心,阴影可能是一个错误,特别是对于初学者来说)。

3

打开构建设置中的“隐藏本地变量”以获得警告。

+0

不错的提示!谢谢! – crizzwald 2013-05-07 15:42:07