Objective-C变量声明混乱

Objective-C变量声明混乱,objective-c,syntax,Objective C,Syntax,我不明白为什么允许我这样做(if语句只是为了显示范围): 我有c#的背景,这样的背景是不允许的。基本上,程序员正在重新定义变量“i”,从而赋予“i”一个新的含义。如有任何见解,将不胜感激 谢谢 部分正确,是的,它给了i一个新的含义,但它没有重新定义变量。这是另一个变量。但是由于标识符是相同的,当前范围将“隐藏”前一个,因此在该块中使用i表示浮点。在C中(扩展,在目标C中),允许在内部范围中声明局部变量,以隐藏外部范围的变量。如果,您可以去掉,并编写以下内容: int i = 0; { /

我不明白为什么允许我这样做(if语句只是为了显示范围):

我有c#的背景,这样的背景是不允许的。基本上,程序员正在重新定义变量“i”,从而赋予“i”一个新的含义。如有任何见解,将不胜感激


谢谢

部分正确,是的,它给了
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
    }
}