Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯП - ПОИТ (Бахтизин) часть 1 редакт.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.76 Mб
Скачать

7. Классы хранения и видимость переменных

7.1. Общие сведения

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

  • автоматический класс хранения (auto)

  • регистровый класс (register)

  • статический класс (static)

  • внешний класс (extern)

Каждый из приведенных классов имеет свои преимущества. Грамотное определение метода хранения переменной – необходимое условие правильности написания любой программы.

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

Объекты классов auto и register имеют локальное время жизни. Спецификаторы static и extern определяют объекты с глобальным временем жизни.

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

7.2. Автоматический класс хранения (auto)

Автоматические переменные создаются при входе в блок (блок в Си – последовательность операторов, заключенная в фигурные скобки), определены только в этом блоке и при выходе из него теряются в памяти машины. Как только происходит выход из блока, в котором была определена эта переменная, область памяти считается свободной, в нее записываются другие данные. Поэтому при каждом вызове функции такая переменная до её явной инициализации будет иметь неопределённое значение, т.е. значение может варьироваться в зависимости от того, какие данные были записаны в отведённый для неё участок памяти до его выделения под переменную. Автоматические переменные не инициализируются самостоятельно при объявлении (т.е. им не присваивается никакого значения), поэтому это необходимо делать самостоятельно.

Рассмотрим часть программы:

int f1(void)

{

auto int x = 10;

}

int f2(void)

{

int x = 35;

}

int main(void)

{

printf(“x=%d”, x);

return 0;

}

В ней в двух функциях f1, f2 объявлены переменные с одинаковыми именами. Необходимо понимать, что друг к другу они не имеют никакого отношения. При компиляции же будет выдана ошибка, т.к. функция main вообще не видит ни одной объявленной переменной x. В функции f1 переменная x объявлена как auto int x, а в f2 – int x. Такие объявления эквивалентны – любая локальная переменная по умолчание относится к автоматическому классу памяти, поэтому спецификатор класса auto можно опустить.

Возможна ситуация, когда глобальная и локальная переменная имеют одно и то же имя, например:

#include <stdio.h>

int num = 10; // объявление глобальной переменной

void write(void);

void main(void)

{

// вывод значения глобальной переменной

printf("\nnum=%d", num);

int num = 20; // объявление локальной переменной

// с тем же именем, что и глобальная

printf("\nnum=%d", num);

write();

}

void write(void)

{

printf("\nnum=%d", num);

}

Результатом выполнения этой программы будет

num=10

num=20

num=10

Когда объявляется локальная переменная num в функции main, глобальная переменная с тем же именем num скрывается. Она становится временно, до выхода из блока, недоступной. При выходе же из main – при выполнении блока функции write, глобальная переменная с именем num становится опять доступной.