На этом шаге мы познакомимся с имеющимися в языке программирования С++
типами, а
также способами размещения переменных в памяти.
Для определения и описания переменных основных типов используются
следующие ключевые слова,
каждое из которых в отдельности может выступать в качестве имени типа:
- char (символьный);
- short (короткий целый);
- int (целый);
- long (длинный целый);
- float (вещественный);
- double (вещественный с удвоенной точностью);
- void (отсутствие значения).
При определении переменных им можно приписывать начальные значения,
которые заносятся
в выделяемую для них память в процессе инициализации. Примеры
определений:
char newsimbol = '\n' ; long filebegin = 0L; double pi = 3.1415926535897932385;
В обозначении типа может использоваться одновременно несколько служебных
слов. Например,
определение: long double zebra, stop; вводит переменные с именами
zebra и
stop вещественного типа удвоенной точности, но явно не присваивает
этим переменным
никаких начальных значений.
Употребляемые как отдельно, так и вместе с другими именами типов
служебные слова
unsigned (беззнаковый) и signed (знаковый) позволяют для
арифметического
или символьного типа выбирать способ учета знакового разряда:
unsigned int i, j, k; // Значения от 0 до 65535. unsigned long L, M ,N; // Значения от 0 до 4294967295. unsigned char с, s; // Значения от 0 до 255.
При таком определении переменные i, j, k могут принимать только
целые положительные
значения в диапазоне от 0 до 65535 и т.д.
Применение в определениях типов отдельных служебных слов int, char, short,
long
эквивалентно signed int, signed char, signed short, signed long. Именно
поэтому
служебное слово signed обычно опускается в определениях и описаниях.
Использование
при задании типа только unsigned эквивалентно unsigned int.
Основные типы данных представлены в таблице 1.
Таблица 1. Основные типы
данных
Тип данных | Размер, бит | Диапазон значений | Назначение типа |
---|---|---|---|
unsigned char | 8 | 0..255 | Небольшие целые числа и коды символов. |
char | 8 | -128...127 | Очень малые целые числа и ASCII-коды. |
enum | 16 | -32768...32767 | Упорядоченные наборы целых значений. |
unsigned int | 16 | 0...65535 | Большие целые и счетчики циклов. |
short int | 16 | -32768...32767 | Небольшие целые, управление циклами. |
int | 16 | -32768...32767 | Небольшие целые, управление циклами. |
unsigned long | 32 | 0...4294967295 | Астрономические расстояния. |
long | 32 | -2147483648...2147483647 | Большие числа, популяции. |
float | 32 | 3.4Е-38...3.4Е+38 | Научные расчеты (7 значащих цифр). |
double | 64 | 1.7Е-308...1.7Е+308 | Научные расчеты (15 значащих цифр). |
long double | 80 | 3.4Е-4932...1.1Е+4932 | Финансовые расчеты (19 значащих цифр). |
Таким образом, тип определяет размер памяти, который выделен для хранения
значения переменной.
Помимо этого важной характеристикой является также способ размещения
этой переменной в
памяти и время ее существования. Для явного задания способа размещения
используются следующие
спецификаторы:
- auto (автоматически выделяемая, локальная память) - используется
при
определении объектов блока (функции). При входе в блок объекту (переменной)
выделяется
память, которая освобождается при выходе из блока. По умолчанию всем
переменным
присваивается этот спецификатор; - register (автоматически выделяемая, по возможности регистровая
память) -
аналогичен auto, но для размещения объектов используются регистры,
а не участки
основной памяти. В случае отсутствия регистровой памяти компилятор
обрабатывает такие
объекты как объекты автоматической памяти; - static (внутренний тип компоновки и статическая продолжительность
существования) -
объект с таким спецификатором будет существовать в пределах того файла с
исходным текстом
программы или модуля, где он определен. Класс памяти static может
приписываться переменным
и функциям; - extern (внешний тип компоновки и статическая продолжительность
существования) -
объект этого класса глобален, то есть доступен во всех модулях (файлах)
программы.
Класс extern может быть приписан переменной или функции.
Кроме явных спецификаторов, на выбор класса памяти значительное влияние
оказывают размещение
определения и описаний объекта в тексте программы. Такими определяющими
частями программы
являются блок, функция, файл с текстом кода программы (модуль) и
т.д. Таким
образом, класс памяти, то есть размещение объекта (в регистре, в стеке, в
динамически
распределяемой памяти, в сегменте) зависит как от синтаксиса определения,
так и
от размещения определения в программе.
Продолжительность существования объектов (в частности,
переменных) - это
период, в течение которого идентификаторам в программе соответствуют
некоторые значения.
Определены три вида продолжительности: статическая,
локальная и динамическая.
Объектам со статической продолжительностью существования
память выделяется в
начале выполнения программы и сохраняется до окончания ее обработки.
Статическую продолжительность
имеют функции и файлы. Остальным объектам статическая продолжительность
существования может
быть задана с помощью спецификаторов класса памяти static и
extern. При отсутствии
явной инициализации такие объекты по умолчанию инициализируются
нулевыми, или пустыми
значениями.
Переменные с локальной продолжительностью существования
создаются при каждом
входе в блок или функцию, где они описаны, и уничтожаются при выходе. Такие
объекты должны
быть инициализированы только явным образом. Память для них выделяется в
регистрах или в стеке.
Область действия такой переменной - блок или функция.
Объекты с динамической продолжительностью существования
создаются и уничтожаются
с помощью явных операторов в процессе выполнения программы. Для
создания используется операция
new и функция malloc(), а для уничтожения - операция
delete или функция
free().
Мы перечислили основные типы переменных и способы размещения их в
памяти.
На следующем шаге мы познакомимся с общей структурой программы на С++.
Предыдущий шаг
Содержание
Следующий шаг