我很困惑,我为什么允许这样做(if语句是只显示范围):Objective-C的变量声明混乱
int i = 0;
if(true)
{
float i = 1.1;
}
我有一个C#背景,这样的事情是不是允许。基本上,程序员重新声明变量'i',从而赋予'我'一个新的含义。任何洞察力将不胜感激。
谢谢!
我很困惑,我为什么允许这样做(if语句是只显示范围):Objective-C的变量声明混乱
int i = 0;
if(true)
{
float i = 1.1;
}
我有一个C#背景,这样的事情是不是允许。基本上,程序员重新声明变量'i',从而赋予'我'一个新的含义。任何洞察力将不胜感激。
谢谢!
在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
}
}
C#标准,可能是因为它拥有的是一个错误的概率高,但C /目标C没有问题用它。
你是部分正确的,是的,它给i
一个新的含义,但它不是重新声明变量。这是另一个变量。但由于标识符相同,当前范围将“隐藏”前一个,因此在该块内使用i
就是指浮动。
你没有重新定义i
,多达shadowingi
。这仅在i
的声明处于不同级别的范围时才有效。 C#允许使用阴影,但不适用于if
语句/ switch
语句,而C/C++/Objective-C允许使用这种阴影。
在内部i
超出范围之后,标识符i
将再次参考i
的int
版本。所以它不会改变原来的i
所指的。隐藏变量通常是不是你想做的事情(除非你小心,阴影可能是一个错误,特别是对于初学者来说)。
我明白了。谢谢你的解释。它帮助明确了这一点。谢谢! – crizzwald 2013-05-07 15:11:49
像往常一样:) – 2013-05-07 15:12:37
@Amin下面说了什么 - 打开“隐藏的局部变量”警告让编译器barf在这个。强烈推荐。 – bbum 2013-05-07 15:44:07