Objective-C变量声明混淆

时间:2013-05-07 15:02:19

标签: objective-c syntax

我很困惑为什么我被允许这样做(if语句只是显示范围):

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

我有一个c#背景,不允许这样的事情。基本上,程序员正在重新声明变量'i',从而赋予'i'新的含义。任何见解都将不胜感激。

谢谢!

4 个答案:

答案 0 :(得分: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 / Objective C没有问题。

答案 1 :(得分:3)

在构建设置中启用“隐藏的本地变量”以获取警告。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您不是要重新定义i,而是重新定义 shadowing i。这仅适用于在不同范围级别声明i的情况。 C#允许阴影,但不允许if语句/ switch语句,而C / C ++ / Objective-C允许这样的阴影。

在内部i超出范围后,标识符i将再次引用int i版本i。所以它不会改变原始{{1}}所指的内容。隐藏变量通常不是你想要做的事情(除非你小心,阴影可能是一个错误,特别是初学者)。