В пособиях по языкам программирования переменную чаще всего определяют как пару "имя" - "значение". Имени соответствует адрес (ссылка) на участок памяти, выделенный переменной, а значением является содержимое этого участка. Именем служит идентификатор, а значение соответствует типу переменной, определяющему множество допустимых значений и набор операций, для которых переменная может служить операндом.
Множество допустимых значений переменной обычно совпадает со множеством допустимых констант того же типа. Таким образом, вводятся вещественные, целые и символьные переменные, причем символьные (char) иногда относят к целым. Целочисленные и вещественные считаются арифметическими типами. Арифметический (включая символьный) тип является частным случаем скалярных типов. К скалярным типам кроме арифметических относятся указатели, ссылки и перечисления.
Переменные типизируются с помощью определений и описаний. Сразу же введем терминологические соглашения. В отличие от описания определение не только вводит объект (например, переменную), но и предполагает, что на основании этого определения компилятор выделит память для объекта (переменной).
Все взаимосвязанные атрибуты объектов (тип, класс памяти, область (сфера) действия имени, видимость, продолжительность существования, тип компоновки) приписываются объекту с помощью определений и описаний, а также контекстом, в котором эти определения и описания появляются. Определения устанавливают атрибуты объектов, резервируют для них память и связывают эти объекты с именами (идентификаторами). Кроме определений, в тексте программы могут присутствовать описания, каждое из которых делает указанные в них идентификаторы известными компилятору. В переводной литературе и особенно в документации наряду с терминами "описание" и "определение" используют "объявление" и "декларация".
Итак, появление двух терминов "определение" и "описание" объясняется тем фактом, что каждый конкретный объект может быть многократно описан, однако в программе должно быть только единственное определение этого объекта. Определение обычно выделяет объекту память и связывает с этим объектом идентификатор – имя объекта, а описания только сообщают свойства того объекта, к которому относится имя. Говорят, что описание ассоциирует тип с именем, а определение, кроме того, задает все другие свойства (объем памяти, внутреннее представление и т.д.) объекта и выполняет его инициализацию. В большинстве случаев описание одновременно является и определением. Однако это не всегда возможно и не всегда требуется. Определять и описывать можно следующие объекты:
• переменные;
• функции;
• классы, их компоненты и указатели на компоненты;
• типы, вводимые пользователем с помощью typedef;
• типы и имена структур, объединений, перечислений;
• компоненты (элементы) структур и объединений;
• массивы объектов заданного типа;
• перечислимые константы;
• метки операторов;
• макросы препроцессора;
• указатели на объекты или функции заданного типа;
• ссылки на объекты или функции заданного типа;
• константы (значения) заданного типа.
Определение переменных заданного типа имеет следующий формат:
[спецафикатор-класа-памяти] [модификатор] тип имя [=инициатор] [,имя [= инициатор] ]...
где
спецификатор класса памяти - (auto, static, extern, register, typedef)
модификатор - const или volatile;
тип- один из основных типов;
имя - идентификатор;
инициатор - необязательный инициализатор, определяющий начальное значение соответствующего объекта.
Для определения и описания переменных основных типов используются следующие ключевые слова, каждое из которых в отдельности может выступать в качестве имени типа:
• char (символьный);
• short (короткий целый);
• int (целый);
• long (длинный целый);
• float (вещественный);
• double (вещественный с удвоенной точностью);
• void (отсутствие значения).
В обозначении типа может использоваться одновременно несколько служебных слов. Например, определение
long double zebra, atop;
вводит переменные с именами zebra и atop вещественного типа повышенной точности, но явно не присваивает этим переменным никаких начальных значений.
Употребляемые как отдельно, так и вместе с другими именами типов служебные слова unsigned (беззнаковый) и signed (знаковый) позволяют для арифметического или символьного типа выбирать способ учета знакового разряда:
unsigned int i, j // Значения от 0 до 65535
unsigned long L, It ,N; // Значения от О до 4294967265
unsigned char с, s; // Значения от 0 до 255
Применение в определениях типов отдельных служебных слов int, char, short, long эквивалентно signed int, signed char, signed short, signed long. Именно поэтому служебное слова signed обычно опускается в определениях и описаниях. Использование при задании типа только одного unsigned эквивалентно unsigned int.
Используя спецификатор typedef, можно в своей программе вводить удобные обозначения для сложных описаний типов. В следующем примере:
typedef unsigned char COD;
COD simbol;
введен новый тип COD - сокращенное обозначение для unsigned char и переменная этого типа simbol, значениями которой являются беззнаковые числа в диапазоне от 0 до 255.
Рассматривая переменные, мы пока использовали базовые (предопределенные целиком или фундаментальные) типы.