Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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




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

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

глобальные (внешние): объявленные в программе либо как внешние (т. е. до заголовка главной функции 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) переменная неявно инициализируется нулем.

 

2. 3. Параметры функции

 

Параметры функции определяются списком формальных параметров. Область видимости формальных параметров – те­ло функции. Имена формальных параметров используются в операторах тела функции. Формальными параметрами могут быть только идентификаторы.

Кроме формальных параметров есть фактические. При вызове функции фактические параметры заменяют формальные, т. е. все формальные параметры в теле функции будут заменены на соответствующие фактические. Этот процесс называется передачей фактических параметров в функцию. Это делается для обмена фактическими данными между вызывающей и вызываемой функцией и получения фактического результата после завершения работы вызываемой функции для передачи его в вызывающую функцию.

Между списками формальных и фактических параметров при вызове функции должно быть соответствие:

1) количества формальных и фактических параметров;

2) последовательности формальных и соответствующих им фактических пара­метров (первому формальному параметру соответствует первый фактический, второму – второй и т. д. );

3) типов формальных и соответствующих им фактических параметров.

Сопоставление формальных и фактических параметров производится при каждом вызове функции: первому формальному параметру будет сопоставлен первый фактический, второму – второй и т. д. При передаче параметров нарушение соответствия по количеству или типам парамет­ров может привести к серьезным ошибкам, например к нарушению границ переменных, в том числе массивов. Некорректная по смыслу передача фактических параметров может привести к неверному результату, хотя алгоритм, записанный в функции, будет верен.

Список формальных параметров может содержать нуль и более объявлений переменных, разделенных запятыми. При объявлении формальных параметров для каждого элемента списка формальных параметров объявляется имя и тип только этого параметра. Объявление каждого формального параметра имеет форму

< имя_типа_параметра> < идентификатор_параметра>

Здесь < имя_типа_параметра> – имя допустимого типа значений, стандартного или определенного пользователем; < идентификатор_параметра> – имя формального параметра.

Отсутствие имени типа параметра в списке формальных параметров является синтаксической ошибкой.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...