Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000101.doc
Скачиваний:
8
Добавлен:
30.04.2022
Размер:
370.18 Кб
Скачать

Контрольные вопросы

  1. Для чего используются директивы препроцессора?

  2. Что такое макроопределение?

  3. Как записывается директива условной компиляции?

  4. Как работает директива #undef?

  5. Какой директивой подключаются при компиляции файлы?

8. Видимость и время жизни переменных

Местоположение объявления влияет на время жизни и видимость; объявления вне всех функций относятся к внешнему уровню, объявления внутри функций и блоков - к внутреннему.

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

int i=1; // внешнее объявление

void main(void);

{ рrintf( "%d\n", i ); // i=1

{ int i=0; рrintf( "%d\n", i ); // i=0

{ int i=2; рrintf( "%d\n", i );} // i=2

рrintf( "%d\n", i ); } // i=0

рrintf( "%d\n", i ); } // i=1

Спецификаторы классов памяти auto, register указывают на локальное время жизни переменных, static, external - на глобальное. Все функции имеют глобальное время жизни.

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

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

// Файл 1

extern int i;

void main ( ){

void next( );

void other( );

i++;

рrintf("%d\n", i); // i=4

next( ); other( ); }

int i = 3;

void next( ) {

i++; рrintf("%d\n", i );} // i=5

// Файл 2

extern int i;

void other( ) {

i++ ; рrintf("%d\n", i );} // i = 6

На внутреннем уровне по умолчанию предполагается класс auto. По умолчанию переменные класса auto не инициализируются.

Для переменной класса register память, если возможно, отводится в регистре, что ускоряет работу программы. Регистровая память применима только для int и адресного типов.

int i=1;

void main(void) {

extern int i ; // ссылка на объявление выше

static int a ; // автоматически a=0

register int b=0; // регистр, если возможно

int c=0; // класс auto

рrintf("%d%d%d%d\n", i, a, b, c); // 1 , 0 , 0 , 0

other();}

other(){

int i=16; // локальная переменная i

static int a=2; // блочная переменная а

a+=2; рrintf("%d%d\n", i, a);} // 16, 4

При повторном вызове other() напечатается: 16, 6, т.к. переменная типа static сохраняет свое значение при повторном входе в блок.

Контрольные вопросы

  1. Для чего введены такие понятия как “время жизни” и “область видимости” переменных?

  2. Как используются статические переменные?

  3. Для чего применяются регистровые переменные?

  4. Какие переменные можно объявить как register?

  5. Какой класс переменных полагается по умолчению на внутреннем уровне описания?

  6. Как инициализируются по умолчанию переменные класса auto?

  7. Каким образом местоположение объявления переменной влияет на ее видимость и время жизни?

9. ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ Си++