Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Область видимости переменных






Каждая переменная, используемая в теле функции, должна быть объявлена в теле функции, в списке формальных параметров или вне функции. Переменные, используемые в функциях:

глобальные (внешние): объявленные в программе либо как внешние (т.е. до заголовка главной функции main() с ключевым словом extern), либо как статические внешние;

локальные (внутренние): объявленные, доступные и используемые только в теле функции;

формальные – переменные, объявленные в списке формальных параметров и доступные только в теле функции.

Объявление переменной вводит её имя в области видимости. Имя переменной может использоваться только в определенной части программы. Для локальной переменной, описанной в теле функции, область видимости начинается с точки объявления до конца тела функции. Если переменная объявлена в блоке (границы блока определяются открывающейся и закрывающейся фигурными скобками), то область видимости её имени определяется границами этого блока. Описание переменной в блоке может скрывать (прятать) её имя во внутреннем блоке. Это значит, что можно переопределять имя внутри блока для ссылки на другой объект. После выхода из блока имя вновь обретает свое прежнее значение:

int x; // глобальное x (по отношению к функции func())

void func()

{

int x; // первое локальное x “прячет” глобальное x

x = 1; // присвоить первому локальному x значение 1

{

int x; // прячет первое локальное x

x = 2; // присвоить второму локальному x значение 2

}

x = 3; // присвоить первому локальному x значение 3

}

int* p = & x; // взять адрес глобального x (по отношению к функции

// func())

Скрытие имен неизбежно при написании больших программ. В этом случае легко не заметить, что имя скрыто и некоторые ошибки, возникающие из-за этого, очень трудно обнаружить. Следовательно, от скрытия имен нужно уходить при написании программ. Использование для глобальных переменных часто употребляемых имен вроде i или x как раз и приводит к ошибкам, вроде переобъявления переменной.

При объявлении переменная создается, когда встречается её описание, и уничтожается, когда её имя выходит из области видимости. Переменные с глобальными именами создаются и инициализируются только один раз и “живут” до завершения программы. Объекты, объявленные с ключевым словом static, ведут себя именно таким образом:

void func()

{

int b = 1; // инициализируется при каждом вызове func()

static int c = 1; // инициализируется только один раз

printf(" a = %i\n", a++);

printf(" b = %i\n", b++);

printf(" c = %i\n", c++);

}

 

extern int a = 1;

int main()

{

while (a< 4)

func();

return 1;

}

 

Функция func() вызывается в цикле while и производит вывод на экран следующее:

a = 1 b = 1 c = 1

a = 2 b = 1 c = 2

a = 3 b = 1 c = 3

Явно неинициализированная статическая (static) переменная неявно инициализируется нулем.

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.008 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал