我对为什么允许我这样做感到困惑(if 语句只是显示范围):
int i = 0;
if(true)
{
float i = 1.1;
}
我有 ac# 背景,不允许这样做。基本上,程序员正在重新声明变量“i”,从而赋予“i”新的含义。任何见解将不胜感激。
谢谢!
我对为什么允许我这样做感到困惑(if 语句只是显示范围):
int i = 0;
if(true)
{
float i = 1.1;
}
我有 ac# 背景,不允许这样做。基本上,程序员正在重新声明变量“i”,从而赋予“i”新的含义。任何见解将不胜感激。
谢谢!
在 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 没有问题。
在构建设置中打开“隐藏的局部变量”以获得警告。
你是部分正确的,是的,它赋予i
了新的含义,但它没有重新声明变量。这是另一个变量。但由于标识符相同,当前作用域将“隐藏”前一个作用域,因此i
该块内的任何使用都指的是浮点数。
你不是在重新定义i
,而是在做阴影 i
。这仅在i
's 在不同级别的范围内声明时才有效。C# 允许遮蔽,但不适用于if
语句/switch
语句,而 C/C++/Objective-C 允许这种遮蔽。
在内部i
超出范围后,标识符i
将再次int
引用i
. 所以它并没有改变原文i
所指的内容。遮蔽变量通常不是您想要做的事情(除非您小心,否则遮蔽可能是一个错误,尤其是对于初学者而言)。