我很困惑为什么我被允许这样做(if语句只是显示范围):
int i = 0;
if(true)
{
float i = 1.1;
}
我有一个c#背景,不允许这样的事情。基本上,程序员正在重新声明变量'i',从而赋予'i'新的含义。任何见解都将不胜感激。
谢谢!
答案 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
}
}
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}}所指的内容。隐藏变量通常不是你想要做的事情(除非你小心,阴影可能是一个错误,特别是初学者)。