Лекция 1

Правила оформления программ на Си/Си++.
Операции и основные типы данных.

Лекция 2

Операторы


Лекция 3

Использование библиотечных процедур СИ

 

Лекция 10

Директивы препроцессора

Лекция 11

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

Лекция 12

Дополнительные возможности Си++


Лекция 13

Объектно-ориентированное программирование

 

главная

Лекция

Лекция №11

Тема: ВИДИМОСТЬ И ВРЕМЯ ЖИЗНИ ПЕРЕМЕННЫХ


Содержание:

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

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

 

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

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

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, extern - на глобальное. Все функции имеют глобальное время жизни.
Статическая внешняя переменная видна в пределах остатка файла. В других файлах и выше она не видна. Переменная типа static может инициализироваться в объявлении, по умолчанию ее значение равно нулю.
Extern-переменная ссылается на переменную, объявленную где-то в другом месте. Переменная видна в других файлах и выше определения в исходном файле. В extern-объявлениях инициализация не допускается.

// Файл 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. Каким образом местоположение объявления переменной влияет на ее видимость и время жизни?


 

 

Hosted by uCoz