Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие2013_09_28.doc
Скачиваний:
24
Добавлен:
20.05.2015
Размер:
2.72 Mб
Скачать

Описание переменных.

По сути дела, переменная – это имя, присваиваемое некоторому участку памяти, где хранятся данные определенного типа. После определения переменной её имя можно использовать для операций с данными в памяти и, в частности, изменять значение переменной.

Описание переменных в общем случае имеет вид:

[класс памяти][const]тип имя[=значение [,имя [=значение…]]];

Поясним назначение составных частей этого описания.

  • Необязательный описатель класс памяти может принимать одно из значений: auto, extern, static, register. Об этом описателе мы поговорим позже.

  • Модификатор const служит для определения именованной константы; присвоенное ей значение изменить нельзя.

  • Поле тип есть один из описателей основных типов ( char, int, float, и т.д.)

  • Имя переменной выбирается по ранее рассмотренным правилам. При этом может осуществляться её начальная инициализация – переменной присваивается заданное значение.

В одном операторе можно описать несколько переменных одного типа, разделяя их запятыми.

Примеры.

int a = 25, b, c = -37;

const char ch = ‘\002’; double x, y, eps =1.0e-5;

double pi = 3.14;

char c, str; float х, dl;

С каждой переменной связаны две её важные характеристики: область действия ( область видимости ) и длительность существования («время жизни»). «Время жизни» переменной связано с выделением памяти под переменную и её освобождением. Область действия определяет ту часть программы, где описываемая переменная доступна для использования. В зависимости от области действия переменная может быть локальной или глобальной.

Атрибут класс памяти определяет «время жизни» переменной и может воздействовать на её область действия, которая зависит не только от самого описателя, но и от его местонахождения в теле программы. Если переменная определена внутри блока, то она называется локальной и область её действия – от точки описания до конца блока, включая все вложенные блоки. Если же переменная определена вне всяких блоков, она называется глобальной и областью её действия будет файл, в котором она определена – от точки описания до конца файла.

А теперь подробнее об описателях класса памяти.

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

Описатель extern служит для объявления глобальной переменной, которая определена в другом месте, вне всяких функций и, быть может, даже в другом файле. Эта переменная доступна всюду в других функциях, если они расположены текстуально ниже точки её определения, либо эта переменная в них объявлена с описателем extern.

Переменная класса static ведёт себя как локальная переменная auto, но выделение памяти и начальная инициализация такой переменной осуществляется только при первой активизации блока (функции), в котором определена static – переменная. Поэтому такая переменная от вызова к вызову функции сохраняет своё предыдущее значение.

Переменная с описателем класса памяти register предположительно размещается компилятором в регистрах микропроцессора для ускорения работы с описываемой переменной. Если такая возможность отсутствует, описатель registr заменяется на auto.

О классах памяти для функций более детально будет сказано далее (в разделе, посвященном функциям).

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

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

Пример.

int x = 145; // определение внешней переменной

int main()

{

extern int y; // описание делает доступной внешнюю переменную y

extern int x; // это описание здесь не обязательно, но необходимо, если

// переменная х определена в другом файле

x=x+1; y=y-1;

cout << “x = “ << x << endl;

cout << “y = “ << y;

return 0;

}

int y = 541; // определение внешней переменной.

В результате на экран будет выведено:

х = 146

у = 540

Одна из особенностей языка С/С++, непривычная для тех, кто знаком с другими языками программирования – относительно либеральные правила, определяющие, когда, где и как должны описываться данные. Например, в отличие от языка Паскаль, требующего, чтобы переменные были полностью описаны до их использования в разделе описания данных, в языке С/С++ описание данных и их инициализация может возникнуть практически в любой точке программы, по мере необходимости в переменных определённого типа.