
Классификация типов данных
Классификация типов данных представлена на рисунке 4.3:
Рисунок 4.3 Классификация типов данных
Способы представления данных
Данные представляются в программе в виде переменных и констант.
Переменная:
-
абстракция, представляемая в программе идентификатором (символическим именем) и некоторой областью памяти;
-
характеризуется типом, который определяет, в первую очередь, размер отведенной для переменной области памяти, и состоянием (значением);
-
в каждый конкретный момент времени может иметь только одно значение, которое может изменять в процессе работы программы;
-
с идентификатором переменной связывается ссылка на начальный байт ее области памяти, по которому в программе осуществляется доступ к ее содержимому (в результате трансляции имя переменной превращается в адрес некоторого участка памяти и во время выполнения программы оно указывает, или ссылается, на этот участок памяти);
-
имеет ряд других характеристик, которые в совокупности с типом, называют атрибутом, и о которых мы поговорим чуть ниже.
Например, определения:
char symbol;
unsigned short counter;
обеспечивают выделение, соответственно, одного и двух байтов памяти:
Память программы – это совокупность переменных, имена которых заданы в программе;
Состояние памяти программы – это совокупность состояний (значений) переменных программы.
Память процесса выполнения программы – не равна «памяти программы» и представляет собой совокупность участков памяти, которые поставлены в соответствие именам переменных. Это происходит, например, из-за того, что в процессе выполнения программы дополнительно выделяется (и затем освобождается) память для динамических переменных.
Константа – значение, не изменяемое при выполнении программы и определяющее свои особенности типом – для корректного представления в памяти компьютера (целые, вещественные, символьные, строковые, перечислимые) – и значением. Тип константы определяется по виду ее записи в программе.
Константы
Константы в С++ изображаются без знака. Отрицательные константы получаются применением операции «унарный минус» к соответствующей положительной константе. Для представления констант в С++ используются литералы.
Неименованная константа – литерал – синтаксически правильная конструкция, которая представляет константу определенного типа (изображает конкретное значение) и записывается непосредственно в тексте программы.
В качестве литералов в С++ могут использоваться:
-
числовые литералы (целые числа)
-
десятичные 33, 44, -52, 8, -461
-
восьмеричные 0738 -0121
-
шестнадцатеричные 0X2F56 -0x2A13B
-
буквы от A(a) до F(f) могут быть использованы для записи значений от 10 до 15 в шестнадцатеричной системе счисления; причем цифры ah .. fh можно записывать как строчными, так и прописными буквами.
-
литералы с плавающей точкой 0.25 -56.12е-12
-
логические константы true false
-
символьные (знаковые) литералы ‘K’ ‘z’ ‘2’
-
строки (строковые литералы) “the first number” “1234”
-
перечислимые значения {red, yellow, green}
-
неопределенный указатель NULL
Числовые литералы могут быть:
-
длинными целыми (явно определяются суффиксом – буквой l или L – тип long, стоящей после константы, и занимают 4 байта). Например: 12L, -1234567890L, 1234567890l – длинная десятичная константа; 0525L – длинная восьмеричная константа; 0ХABCL – длинная шестнадцатеричная константа.
-
беззнаковыми (явно определяются суффиксом – буквой u или U – тип unsigned, стоящей после константы, и занимают 2 или 4 байта, в зависимости от «основного» типа константы). Например: 12U, 1245U или 1245u – беззнаковая десятичная константа (занимает 4 байта); 525UL (или 525 LU, разрешается комбинировать оба суффикса в любом порядке) – беззнаковая длинная десятичная константа (занимает 4 байта).
Литералы с плавающей точкой всегда представляются в десятичной системе счисления числами с фиксированной или с плавающей точкой двойной точности, т.е. имеющими тип double – двойная точность. Для них возможно задание типа-суффикса: F или f – тип float – одинарная точность; L или l – тип long double – повышенная точность. При отсутствии суффикса подразумевается тип double. Литералы состоят из целой части – последовательности цифр; десятичной точки; дробной части – последовательности цифр; символа экспоненты e или E; экспоненты в виде целой константы (может быть со знаком).
(целая часть).(дробная часть)[e или E ± целая константа][l или L или f или F].
Дробная часть числа от целой части отделяется точкой; ноль в целой или дробной частях можно не записывать, но не в обеих частях сразу. Любая часть (но не обе сразу) из нижеследующих пар может быть пропущена: целая или дробная; десятичная точка или символ е (Е) и экспонента в виде целой константы. Например:
456.73f 23.678 5F // 4 байта (тип float)
15.75 .75 // 8 байтов (тип double по умолчанию)
1.575Е1 .0075е2 -2.5е-3
1575е-2 -.125 -0.0025
25е-4 -.175Е-2 0.1е9
1298760.0 -0.5437634Е-6 12345f
12345678967.54675l 12345463754.9L // (тип long double)
Символьные литералы имеют тип char (signed char) и представляют символ таблицы кодов ASCII, заключенный в апострофы: ’A’, ’я’, ’+’, ’\n’. Между апострофами может быть записан произвольный знак, кроме апострофа и обратной дробной черты (\). Символьные литералы, представляющие символы с кодами, большими, чем 127, трактуются как данные целого типа int с отрицательными значениями.
Символьная константа может использоваться как целая константа, причем ее значением является интерпретация в виде целого значения внутреннего представления символьной константы.
Непечатаемый символьный литерал записывается между апострофами, причем символу предшествует обратная дробная черта. Символ \ (backslash) используется для определения ESC-последовательностей, служащих для визуального представления неграфических символов. Сам непечатаемый символ может быть представлен:
-
одним знаком: n – переход на новую строку (код #10#13), t – горизонтальная табуляция (код #9), r – возврат каретки (код #13), a – звонок (код #7), \ - обратная дробная черта, b – возврат на один шаг (backspace, код #8);
-
числом из 1 .. 3 восьмеричных цифр, определяющим код знака; любой символ может быть представлен также ESC-последовательностью – последовательностью трех восьмеричных цифр: ‘\ddd’, где ddd – восьмеричные цифры, представляющие позицию символа в таблице кодов ASCII.
-
числом, определяющим код знака, из 1-3 шестнадцатеричных цифр (с предшествующей буквой X или х); это справедливо и для печатаемых символов.
Например:
‘\x27’ – АSCII-код апострофа в 16-ричной системе счисления;
‘\n’ – переход на новую строку;
‘\0’ – нуль-символ (NULL) окончания строки в С++.
Таблица 4.4. Управляющие символьные константы (основные ESC-последовательности)
-
содержание
последовательность
обозначение
значение
Перевод строки (новая строка)
\n
NL (LF)
0ха
Возврат каретки
\r
CR
0хd
Звонок
\a
BEL
0х7
Горизонтальная табуляция
\t
HT
0х9
Вертикальная табуляция
\v
VT
0хb
Возврат на шаг
\b
BS
0х8
Перевод формата
\f
FF
Обратная косая
\\
\
0х5с
Апостроф
\’
‘
0х27
Кавычки
\”
“
0х22
Знак вопроса
\?
?
Нулевой символ (пусто)
‘\0’
NULL
Восьмеричный код
\ооо
ооо
Шестнадцатеричный код
\хhh
hh
Строковый литерал – последовательность символов, заключенная в двойные кавычки, может содержать любые символы алфавита языка, например: ”A”, ”строка”, ”string”. Строки ограничиваются (завершаются) символом ’\0’ (компилятор добавляет символ автоматически).
Пустая строка определяется как ”” и сохраняется как символ ‘\0’, т.е. имеет длину, равную 1. Cимвольная константа и строка из одного символа не одно и то же: ’x’ не есть ”x”. Первое – это один символ, второе – строка, содержащая букву х и ‘\0’ (имеет длину 2). Поэтому при создании строки (как массива символов) необходимо предусматривать дополнительный байт на символ ‘\0’, а при инициализации такой строки в число инициализирующих элементов включать в качестве завершающего символа ’\0’.
Примеры строковых литералов:
”5” // строковый литерал из символов ’5’ и ’\0’
”symbol” // строковый литерал из семи символов, включая символ ’\0’
”\’” // строковый литерал из апострофа и завершающего нуля
”” // пустая строка (содержит только код завершающего нуля).
”a\tb\n”– //строковые литералы могут содержать управляющие последовательности; // при записи литерала в операторе вывода, на экран выводится: буква a; //несколько пробелов, соответствующих значению символа табуляции; //буква b. После этого происходит переход на следующую строку.
Две строковые константы, разделенные любыми символами – разделителями и следующие одна за другой, компилятором объединяются:
char *longStr = “Это очень длинная строка, которая не умещается”
“на одной строке, поэтому мы разбили её на 3.”
“И не обязательно писать + между строками, компилятор сам склеит.”
cout <<s << endl; //выведет на экран все полностью
Длинную строковую константу можно разместить на нескольких строках, используя в качестве знака переноса обратную косую черту:
char *longStr1= “Никто не доволен своей \
внешностью, но все довольны\
своим умом”
Текст программы не должен выходить за пределы ширины экрана для того, чтобы было удобно читать и распечатывать программу.
Именованные литералы позволяют сделать запись литералов в тексте выражений более наглядной. Один способ определения именованных литералов в С++ – использование директивы препроцессора #define:
#define IDENTIFICATOR ZAMENA
Каждое появление текста IDENTIFICATOR заменяется на текст ZAMENA.
#define MAX_LEN 100 // MAX_LEN заменится на 100
Размерность массива, при необходимости, также можно определить с помощью директивы:
исходный текст |
результат препроцессорной обработки |
#define K 40 void main () {int M[K] [K]; float A[K], B[K] [K]; ……. |
void main () {int M[40] [40]; float A[40], B[40] [40]; |
При таком описании легко изменять предельные размеры сразу всех массивов, изменив только одну константу в команде #define.
Те же возможности в языке С++ обеспечивают именованные константы, определенные в тексте программы. Именованную константу можно объявить, присвоив ей идентификатор, который использовать затем в программе вместо непосредственно записанного значения константы.
Именованные константы следует использовать:
-
для задания параметров, управляющих: - размером структур данных (например, массивов: const int n=10; int mas[n]; ), - числом итераций в циклах (const int k=10; for (int i=1; i<k; i++) ….)
-
для задания значений, изменение которых может потребоваться при отладке или модернизации программы;
-
для обозначения часто встречающихся в программе постоянных величин;
-
при использовании констант, имеющих общеупотребительные обозначения.