Чтение онлайн

ЖАНРЫ

Язык Си - руководство для начинающих

Д. МАРТИН

Шрифт:

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

Следует еще сказать об области действия автоматической переменной: область действия ограничена блоком ({ }), в котором переменная описана. Мы всегда должны описывать наши переменные в начале тела функции (блока), так что областью действия их является вся функция. Однако в принципе можно было бы описать переменную внутри подблока. Тогда переменная будет известна только в этой части функции. Обычно при создании программы, программисты

редко принимают во внимание упомянутое свойство. Но иногда торопливые программисты пользуются такой возможностью, особенно когда пытаются быстрее внести коррективы.

Внешние переменные

Переменная, описанная вне функции, является внешней. Внешнюю переменную можно также описать в функции, которая использует ее, при помощи ключевого слова extern. Описания могут выглядеть примерно так:

int errupt; /* Три переменные, описанные вне функции */

char coal;

double up;

main

{

extern int errupt; /* объявлено, что 3 переменные */

extern char coal; /* являются внешними */

extern double up;

Группу extern– описаний можно совсем опустить, если исходные определения переменных появляются в том же файле и перед функцией, которая их использует. Включение ключевого слова extern позволяет функции использовать внешнюю переменную, даже если она определяется позже в этом или другом файле. (Оба файла, конечно, должны быть скомпилированы, связаны или собраны в одно и то же время.)

Если слово extern не включено в описание внутри функции, то под этим именем создается новая автоматическая переменная. Вы можете пометить вторую переменную как "автоматическую" с помощью слова auto и тем самым показать, что это ваше намерение, а не оплошность. Три примера демонстрируют четыре возможных комбинация описаний:

/* Пример1 */

int hocus;

main {

extern int hocus; /* hocus описана внешней */

...

}

magic {

extern int hocus;

...

}

Здесь есть одна внешняя переменная hocus, и она известна обеим функциям main и magic.

/* Пример2 */

int hocus ;

main

{

extern int hocus; /* hocus описана внешней */

...

}

magic

{

/* hocus не описана совсем */

...

}

Снова есть одна внешняя переменная hocus, известная обеим функциям. На этот раз она известна функцииmagic по умолчанию.

/* Пример3 */

int hocus;

main

{

int hocus; /* hocus

описана и

является автоматической по умолчанию */

...

}

magic

 {

auto int hocus; /* hocus описана автоматической */

...

}

В этом примере созданы три разные переменные с одинаковым именем. Переменная hocusв функции mainявляется автоматической по умолчанию и локальной для main, в функции magicона явно описана автоматической и известна только для magic. Внешняя переменная hocus неизвестна ни main, ни magic, но обычно известна любой другой функции в файле, которая не имеет своей собственной локальной переменной hocus.

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

Статические переменные

Название раздела не следует понимать буквально, т. е. считать, что такие переменные не могут изменяться. В действительности слово "статические" здесь означает, что переменные остаются в работе. Они имеют такую же область действия, как автоматические переменные, но они не исчезают, когда содержащая их функция закончит свою работу. Компилятор хранит их значения от одного вызова функции до другого. Следующий пример иллюстрирует это и показывает, как описать статическую переменную.

/* статическая переменная */

main

{

int count;

for (count = 1; count <= 3; count++)

{

printf(" Итерация %d:\n", count);

trystat;

}

}

trystat

{

int fade = 1;

static int stay; = 1;

printf("fade = %d и stay = %d\n", fade++, stay++);

}

Заметим, что функция trystat увеличивает каждую переменную после печати ее значения. Работа этой программы даст следующие результаты:

Итерация 1:

fade = 1 и staly = 1

Итерация 2:

fade = 1 и stay = 2

Итерация 3:

fade = 1 и stay = 3

Статическая переменная stay"помнит", что ее значение было увеличено на 1, в то время как для переменной fade начальное значение устанавливается каждый раз заново. Это указывает на разницу в инициализации: fade инициализируется каждый раз, когда вызывается trystat, в то время как stay инициализируется только один раз при компиляции функции trystat.

Внешние статические переменные

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