Главная » 2013 » Февраль » 11 » 4. Переменные
20:30
4. Переменные
Переменные

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

int a;
float x;


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

[класс памяти] [const] тип имя [инициализатор];

Здесь и далее на общем виде квадратные скобки [] указывают на необязательные составные части объектов и структур.
Рассмотрим правила задания составных частей этого оператора.
Необязательный класс памяти может принимать одно из значений auto, extern, static и register. О них рассказывается чуть ниже.
Модификатор const показывает, что значение переменной изменять нельзя. Такую переменную называют именованной (типизированной) константой, или просто константой.
При описании можно присвоить переменной начальное значение, это называется инициализацией. Инициализатор можно записывать в двух формах: 
-    со знаком равенства:
        = значение, например:

short int а = 1; const char С = 'С';

-    или в круглых скобках:
        ( значение ), например:

float x(3); char t (54);

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

float с = 0.22, x(3), sum;

Описание переменной явно или по умолчанию задает ее область действия.
Область действия переменной – это часть программы, в которой ее можно использовать для доступа к связанной с ней области памяти. В зависимости от области действия переменная может быть локальной или глобальной.
Если переменная определена внутри блока (блок ограничен фигурными скобками {}), она называется локальной, область ее действия – от точки описания до конца блока, включая все вложенные блоки. Если переменная определена вне любого блока, она называется глобальной и областью ее действия считается файл (файл иногда называют модулем (Unit)), в котором она определена, от точки описания до его конца.
Класс памяти определяет время жизни и область видимости программного объекта (в частности, переменной).
Время жизни может быть постоянным (в течение выполнения программы) и временным (в течение выполнения блока). Это поясняется ниже, при описании классов.
Областью видимости идентификатора называется часть текста программы, из которой допустим обычный доступ к связанной с идентификатором областью памяти. Чаще всего область видимости совпадает с областью действия. Исключением является ситуация, когда во вложенном блоке описана переменная с таким же именем. В этом случае внешняя переменная во вложенном блоке невидима, хотя он и входит в ее область действия. Тем не менее, к этой переменной, если она глобальная, можно обратиться, используя операцию доступа к области видимости два двоеточия, например  ::a=1.
Для задания класса используются следующие спецификаторы:

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

extern – означает, что переменная определяется в другом месте программы (в другом файле или дальше по тексту). Используется для создания переменных, доступных во всех модулях программы, в которых они объявлены. Если переменная в том же операторе инициализируется, спецификатор extern игнорируется (переменная уже не может быть внешней).
static – статическая переменная. Время жизни – постоянное. Инициализируется один раз при первом выполнении оператора, содержащего определение переменной. В зависимости от расположения оператора описания статические переменные могут быть глобальными и локальными. Глобальные статические переменные видны только в том модуле, в котором они описаны.

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

volatile – применяется для объявления переменных, которые можно на-звать нестабильными. Спецификатор volatile сообщает компилятору, что значение переменной может изменяться как бы само по себе, например, некоторым фоновым процессом или аппаратно. Поэтому компилятор не должен пытаться как-либо оптимизировать выражения, в которые входит переменная, – предполагая, например, что ее значение не менялось с предыдущего раза и потому выражение не нужно заново пересчитывать. Есть и другой момент. В программе могут быть так называемые критические участки кода, во время исполнения которых изменение значения нестабильной переменной приведет к абсурдным результатам. (Возьмите случай оценки "А или не-А”, если А нестабильно!) Для таких критических участков компилятор должен создавать копию, например, в регистре, и пользоваться этой копией, а не самой переменной.
Можно написать такое объявление:

volatile const int vciVar = 10;

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

Примеры описания переменных:
int a;     // 1 глобальная переменная а
int main()
{
int b;    // 2 локальная переменная b
extern int x;    // 3 переменная х определена в другом месте
static int с;    // 4 локальная статическая переменная с
а = 1;    //5 присваивание глобальной переменной
int а;    //6 локальная переменная а
а = 2;    //7 присваивание локальной переменной
::а = 3;    //8 присваивание глобальной переменной
return 0;
}
int x = 4;    //9 определение и инициализация х


В этом примере глобальная переменная «а» определена вне всех блоков. Память под нее выделяется в сегменте данных в начале работы программы, областью действия является вся программа. Область видимости – вся программа, кроме строк 6-8, так как в первой из них определяется локальная переменная с тем же именем, область действия которой начинается с точки ее описания и заканчивается при выходе из блока. Переменные «b» и «с» – локальные, область их видимости – блок, но время жизни различно: память под «b» выделяется в стеке при входе в блок и освобождается при выходе из него, а переменная «с» располагается в сегменте данных и существует все время, пока работает программа.
Если при определении начальное значение переменных явным образом не задается, компилятор присваивает глобальным и статическим переменным нулевое значение соответствующего типа. Автоматические переменные в этом случае не инициализируются (содержимое переменной будет произвольным).
Имя переменной должно быть уникальным в своей области действия (например, в одном блоке не может быть двух переменных с одинаковыми именами). Не жалейте времени на придумывание подходящих имен. Имя должно отражать смысл хранимой величины, быть легко распознаваемым и, желательно, не содержать символов, которые можно перепутать друг с другом, например, 1,1 (строчная L) или I (прописная i). Для разделения частей имени можно использовать знак подчеркивания. Не давайте переменным имена, демонстрирующие знание иностранного слэнга. Как правило, переменным с большой областью видимости даются более длинные имена (желательно с префиксом типа), а для переменных, вся жизнь которых проходит на протяжении нескольких строк исходного текста, хватит одной буквы с комментарием при объявлении.
Описание переменной может выполняться в форме объявления или определения. Объявление информирует компилятор о типе переменной и классе памяти, а определение содержит, кроме этого, указание компилятору выделить память в соответствии с типом переменной. В C++ большинство объявлений являются одновременно и определениями. В приведенном выше примере только описание внешней переменной 3 по счету является объявлением, но не определением.
Переменная может быть объявлена многократно, но определена только в одном месте программы, поскольку объявление просто описывает свойства переменной, а определение связывает ее с конкретной областью памяти.
Категория: С++ Builder | Просмотров: 721 | Добавил: Andre99 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]