Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_по_пяву_4.doc
Скачиваний:
101
Добавлен:
15.03.2015
Размер:
1.29 Mб
Скачать
    1. Внешние переменные и процедурная абстракция

Существуют две категории переменных в программе, написанной на языке Си:

  • локальные,

  • внешние (глобальные).

Локальными переменными называются переменные, объявленные в теле функции. Внешние переменные – это переменные, объявленные вне функций. Память для внешних переменных выделяется в статической области основной памяти. Все переменные, память для которых выделяется в статической области принято называть статическими. Время статических переменных совпадает со временем выполнения программы. Локальные переменные – это переменные, относящиеся к реализации функции. Память для таких переменных по умолчанию выделяется в стеке. Принято переменные, память для которых выделяется в стеке, называть автоматическими. Локальную переменную можно разместить в статической области памяти. Для этого в ее определении следует использовать зарезервированное слово static. Примером переменной, которую следует объявлять внутри функции, является счетчик цикла.1

Укажем на одно полезное нововведение стандарта C99, которое касается объявления локальных переменных. Дело заключается в том, что этот стандарт разрешает объявлять переменные внутри инструкцииfor. Причем область видимости этой переменной ограничивается телом цикла. Например:

/* Стандарт С89 */ int s =0, i; for(i = 0; i < 10; i++) s += i * i; printf(“i=%d”, i);

    1. Понятие о прототипе. Компиляция

Понятие прототипа вначале появилось в языке C++. Затем оно было заимствовано языком Си, что нашло отражение в стандарте С89. Прототипом функции может служить ее заголовок, после которого поставлен символ точка с запятой. В прототипе необязательно указывать имена формальных параметров. Прототип для разработанной выше функции max2() может быть записан в одном из следующих видов:

doublemax2(doublea,doubleb);

double max2(double, double);

Предпочтительнее указывать в прототипах имена параметров, наделяя их мнемоническим смыслом. Это повышает читабельность программы. Прототипы необходимы для корректной компиляции вызова функции. Следует отметить, что стандарт с89 не был последовательным в отношении использования прототипов. Он в отличие от языка С++ допускал компиляцию вызова функции при отсутствии прототипа. В этом случае компилятор создавал так называемое неявное объявление функции, которое имеет следующий формат:

int имя();

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

В стандарте С99 неявные объявления больше не поддерживает.

/* Стандарт С99 */ ints=0;for(inti= 0;i< 10;i++)s+=i*i; /*printf(“i=%d”,i); на переменнуюiссылаться нельзя она здесь невидна. */

    1. Старый стиль определения функции

В соответствии со старым стилем функция состоит из трех составных частей:

  • Заголовок.

  • Определение формальных параметров.

  • Тело функции.

Заголовок функции, написанной в соответствии со старым стилем, имеет следующий формат:

[тип] имя([список_формальных_параметров])

В отличие от нового стиля организации функций в старом стиле в заголовке функции в аргументных скобках не указывались типы формальных параметров. Кроме того, в старом стиле записи определений функции указывать тип возвращаемого значения указывать было не обязательно. При этом отсутствии спецификации типа по умолчанию предполагался тип int. Стандарт С99 отменил действие принципа умолчания в отношении типа int. Например, заголовок функции max2(), написанный в соответствии со старым стилем, имел бы следующий вид:

double max2(a, b)

Определения формальных параметров записывались вне заголовка функции и располагались после заголовка функции, но до ее тела.

Тело функции, записанной в соответствии со старым стилем, строится по тем же правилам, что и использовании нового стиля. Для иллюстрации организации функций в соответствии со старым стилем перепишем определение функции max2(), приведенное выше.

/* Определение функции max2(), записанное в соответствии со старым стилем*/ doublemax2(a, b) // Заголовок функцииdoublea, b; // Объявление формальных параметров { // Начало тела функции doublemax;if(a > b) max = a;elsemax = b;returnmax; }