我们可以在程序的内部和外部块中声明一个变量吗?如果以编程方式它不会产生任何问题,为什么它被称为不良实践..
答案 0 :(得分:4)
在C中,变量是词法范围的,这意味着在代码中的任何给定点,编译器都知道给定名称引用了哪个实际变量。问题是如果你有两个名为foo
的变量,(a)你可能不记得哪个是哪个,而(b)你不能参考当你在内foo
的范围内时,到外foo
。
特别是:
void MyFunction()
{
int foo = 1;
printf("%d", foo); // prints "1"
// create a new scope...
if (whatever)
{
int foo = 2;
printf("%d", foo); // prints "2"
foo = 3;
printf("%d", foo); // prints "3"
}
printf("%d", foo); // prints "1"
}
现在,想象一下whatever
块很长很复杂......当你到达foo = 3
时,让我们说块的顶部不在屏幕上,但您知道MyFunction
有一个名为foo
的函数范围变量。唯一的问题是你错了,你只设置了“内部”foo
的值。从编译器的角度看,它显而易见......因为内部foo
完全隐藏了外部的{{1}}。这就是为什么它被认为是一种不好的做法。
您可能需要阅读http://en.wikipedia.org/wiki/Scope_(programming)以了解有关词法范围的更多信息。
答案 1 :(得分:3)
源代码很难理解,这就是问题所在,但它是合法的。
答案 2 :(得分:2)
因为你隐藏了一个范围内的变量 - 这是一个犯错的好方法。在小程序中,您可以记住哪个变量是全局/本地的 - 更复杂的是不是。
答案 3 :(得分:2)
您可以在函数(局部变量)或外部函数(全局变量)中声明变量。通常应该最小化变量的范围,因为这使代码更容易理解。
例如,如果您在一个函数中修改全局变量的值,并调用另一个函数,由于无关的原因,也会修改该变量,结果代码可能会执行您不期望的事情并且有人在阅读你的代码时不会指望(更别说如果你那么尝试并行代码......)
答案 4 :(得分:1)
这称为variable shadowing,它对构造函数等小东西有好处,但从长远来看会导致问题:
底线:是的,你可以做到,但尽可能地避免它,特别是在大型项目中,因为你可能最终会被刺伤:P