Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Области действия и видимости переменных

Читайте также:
  1. II. Массаж области предплечья.
  2. II. Растирания ягодичной области.
  3. II. Сфера действия Порядка
  4. III. Основные направления единой государственной политики в области гражданской обороны.
  5. IV. Реализация единой государственной политики в области гражданской обороны.
  6. А)у журналиста, сотрудников редакции обычно нет познаний в области уголовного права, процесса, криминалистики, а у следователя - недостаточные познания в области журналистики;
  7. Активные действия

 

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

Существует пять категорий областей действия:

 

- блок;

- функция;

- прототип функции;

- файл;

- вся программа.

 

Пояснение. Блоком называется группа

операторов, заключенная в фигурные

скобки. В частности, блоком является

тело любой функции.

 

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

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

Место размещения объекта в памяти и продолжительность его существования определяются к л а с с о м п а м я т и. Их всего четыре:

 

auto - автоматический;

static - статический;

register - регистровый;

extern - внешний.

 

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

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

Если при описании локальной переменной ей не присвоено никакого численного значения, то до первого явного присваивания ее содержимое произвольно и непредсказуемо. Говорят, что она содержит "мусор".

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

При объявлении любой переменной можно при желании присвоить ей численное значение. Эта процедура носит обобщенное название инициализации переменной.

Переменная класса auto чаще всего инициализируется именно при ее объявлении, например:

 

double c = 31.5;

 

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

Указание атрибута static для конкретных объектов программы

(кроме функций) обязывает компилятор выделить для них место в сегменте данных программы. Поэтому их время жизни всегда равно времени работы программы.

Если переменная описана вне функций, то ей приписывается класс памяти static по умолчанию.

Область видимости определяется аналогично переменным класса auto. Если статическая переменная описана внутри блока, то она доступна только в этом блоке и во всех вложенных в него блоках. При выходе из блока она сохраняет свое текущее значение, котороестановится доступным при последующем обращении к блоку.

Если переменная описана вне функций, то она видна и доступна, начиная от места ее объявления до конца файла.

 

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

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

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

вида

 

extern int var;

 

- это не создание новой переменной var, а ее объявление как внешней ссылки для компоновщика.

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

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

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

пределах "своего" файла.

 

 

2.2.4. Инициализация переменных

 

Любая переменная обязана получить численное значение либо

при ее объявлении, либо в процессе работы программы посредством

оператора присваивания.

Все объекты, имеющие классы памяти static или extern, ини-

циализируются однократно во время компиляции. Если им явно не

присвоено численного значения, они автоматически обнуляются.

Объекты классов auto и register инициализируются каждый раз

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

значение в данный момент неизвестно, то содержимое соответствую-

щей ячейки памяти в стеке (для auto) или содержимое отведенного

регистра (для register) будет содержать непредсказуемую информа-

цию ("мусор").


Дата добавления: 2015-10-16; просмотров: 114 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Основные типы данных| Мировоззрение как феномен человеческой культуры. Исторические типы мировоззрения. Особенности философского мировоззрения.

mybiblioteka.su - 2015-2024 год. (0.008 сек.)