3

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

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

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

谢谢!

4

4 回答 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 没有问题。

于 2013-05-07T15:07:03.283 回答
3

在构建设置中打开“隐藏的局部变量”以获得警告。

于 2013-05-07T15:10:35.880 回答
1

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

于 2013-05-07T15:06:35.267 回答
1

你不是在重新定义i,而是在做阴影 i。这仅在i's 在不同级别的范围内声明时才有效。C# 允许遮蔽,但不适用于if语句/switch语句,而 C/C++/Objective-C 允许这种遮蔽。

在内部i超出范围后,标识符i将再次int引用i. 所以它并没有改变原文i所指的内容。遮蔽变量通常不是您想要做的事情(除非您小心,否则遮蔽可能是一个错误,尤其是对于初学者而言)。

于 2013-05-07T15:08:39.897 回答