Objective-C变量声明混乱
我不明白为什么允许我这样做(if语句只是为了显示范围): 我有c#的背景,这样的背景是不允许的。基本上,程序员正在重新定义变量“i”,从而赋予“i”一个新的含义。如有任何见解,将不胜感激Objective-C变量声明混乱,objective-c,syntax,Objective C,Syntax,我不明白为什么允许我这样做(if语句只是为了显示范围): 我有c#的背景,这样的背景是不允许的。基本上,程序员正在重新定义变量“i”,从而赋予“i”一个新的含义。如有任何见解,将不胜感激 谢谢 部分正确,是的,它给了i一个新的含义,但它没有重新定义变量。这是另一个变量。但是由于标识符是相同的,当前范围将“隐藏”前一个,因此在该块中使用i表示浮点。在C中(扩展,在目标C中),允许在内部范围中声明局部变量,以隐藏外部范围的变量。如果,您可以去掉,并编写以下内容: int i = 0; { /
谢谢 部分正确,是的,它给了
i
一个新的含义,但它没有重新定义变量。这是另一个变量。但是由于标识符是相同的,当前范围将“隐藏”前一个,因此在该块中使用i
表示浮点。在C中(扩展,在目标C中),允许在内部范围中声明局部变量,以隐藏外部范围的变量。如果,您可以去掉,并编写以下内容:
int i = 0;
{
// Here, the outer i becomes inaccessible
float i = 1.1;
{
int i = 2;
printf("%d", i); // 2 is printed
}
}
C#standard决定反对这一点,可能是因为它很有可能是一个错误,但C/目标C对此没有问题。你不是在重新定义i
,而是在隐藏i
。仅当在不同的范围级别声明了i
时,这才起作用。C#允许阴影,但不适用于if
statements/switch
语句,而C/C++/Objective-C允许这种阴影
内部i
超出范围后,标识符i
将再次引用i
的int
版本。所以它并没有改变原来的i
所指的内容。隐藏变量通常不是您想要做的事情(除非您非常小心,否则隐藏很可能是一个错误,尤其是对于初学者)。在构建设置中打开“隐藏的局部变量”以获得警告。我明白了。谢谢你的解释。这有助于澄清这一点。谢谢@Amin在下面说了些什么——打开“隐藏的局部变量”警告,让编译器对此进行barf。强烈推荐。
int i = 0;
{
// Here, the outer i becomes inaccessible
float i = 1.1;
{
int i = 2;
printf("%d", i); // 2 is printed
}
}