Objective-C变量声明混淆

3
我感到困惑的是为什么我被允许这样做(if语句只是展示作用域):
int i = 0;
if(true)
{
    float i = 1.1;
}

我有C#编程背景,这样的声明是不允许的。基本上,程序员在重新声明变量“i”,因此给“i”赋予了新的含义。欢迎提供任何见解。

谢谢!

4个回答

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
    }
}

演示

C#标准决定不支持此操作,可能是因为它有很高的出错概率,但C/Objective C没有问题。


我明白了,谢谢你的解释,帮我搞清楚了。感谢! - crizzwald
1
下面@Amin所说的是——打开“隐藏的本地变量”警告,让编译器对此进行报错。强烈建议这样做。 - bbum

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

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

1
您并非重新定义变量i,而是在遮蔽它。只有当i在不同层级的范围内声明时才会起作用。C#允许遮蔽,但不适用于if语句/switch语句,而C/C++/Objective-C则允许此类遮蔽。
当内部的i超出范围后,标识符i将再次引用iint版本。因此,这并未改变原始i所指向的内容。遮蔽变量通常不是您想要做的事情(除非您小心,否则遮蔽很可能是一个错误,尤其是对于初学者来说)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接