В 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
.Единственная проблема в том, что вы не правы, вы только устанавливаете значение "inner" foo
.С точки зрения компилятора это очевидно ... потому что внутренний foo
полностью скрывает внешний.Вот почему это считается плохой практикой.
Вы можете прочитать http://en.wikipedia.org/wiki/Scope_(programming), чтобы узнать больше о лексической области видимости.