
- •Данных. Составные структуры данных
- •3.2.1 Общие положения
- •3.2.1.1 Алфавит языка
- •3.2.1.2 Формат программы
- •3.2.1.3. Комментарии
- •// Пример однострочного комментария
- •3.2.1.4 Зарезервированные слова
- •3.2.2 Данные
- •3.2.2.1 Идентификаторы данных
- •3.2.2.2 Типы данных
- •3.2.2.3 Постоянные
- •3.2.2.4 Переменные
- •3.2.2.5 Массивы
- •3.2.2.6 Структуры
- •3.2.2.7 Объединения
- •Масив X:
- •Адреса элементу:
- •Масив y:
- •3.2.2.8 Перечисления
- •3.2.2.9 Указатели
- •Int Hour;
- •Int Press;
- •3.2.2.9.1 Динамическое выделения памяти для хранения данных
- •3.2.2.9.2 Динамическое освобождение памяти от хранимых данных
- •3.2.2.9.3 Ссылка
- •3.2.2.10 Множества
- •3.2.3 Выражения
- •3.2.3.1 Арифметические операции
- •Char int float | signed unsigned | short (базовый) long
- •3.2.3.2 Битовые операции
- •3.2.3.2 Логические операции
- •3.2.3.4 Операции отношения
- •3.2.3.5 Операция присваивания
- •3.2.3.6 Специальные операции
- •3.2.3.7 Элементарные функции
- •3.8 Приведение типов данных
- •3.2.3.9 Приоритеты операций
- •3.2.3.10 Адресные выражения
3.2.1.4 Зарезервированные слова
Зарезервированные слова – это лексемы, обозначающие элементы языка С++ (таблица 3.2.1).
Таблица 3.2.1
asm |
do |
if |
return |
typedef |
and |
auto |
double |
inline |
short |
typeid |
and_eq |
bool |
dynamic_cast |
int |
signed |
typename |
bitand |
break |
else |
long |
sizeof |
union |
bitor |
case |
enum |
mutable |
static |
unsigned |
compl |
catch |
explicit |
namespace |
static_cast |
using |
not |
char |
export |
new |
struct |
virtual |
not_eq |
class |
extern |
operator |
switch |
void |
or |
const |
false |
private |
template |
volatile |
or_eq |
const_cast |
float |
protected |
this |
wchar_t |
xor |
continue |
for |
public |
throw |
while |
xor_eq |
default |
friend |
register |
true |
|
|
delete |
goto |
reinterpret_cast |
try |
|
|
Порядок использования зарезервированных слов строго предопределён семантикой языка. Так, например, зарезервированное слово int может быть использовано для описания типа данного, но не его имени, а потому никак не может быть частью лексемы вроде int = 2;.
3.2.2 Данные
В качестве данных (см. раздел 1) могут выступать2:
скаляры: постоянные, переменные, перечисления, указатели и ссылки;
агрегаты: массивы, структуры, объединения и их комбинации, а также классы;
функции.
3.2.2.1 Идентификаторы данных
Идентификатор – это мнемоническое имя данного, совокупности данных или процедуры, формируемое согласно правилу:
идентификатор ::= буква {буква | десятичная цифра};
Данные хранятся в ячейках памяти компьютера, доступ к которым можно получить, обращаясь к ячейкам по их идентификаторам. Длина идентификатора не может превышать 250 значащих символов. В качестве идентификаторов нельзя использовать зарезервированные слова. Примеры правильных идентификаторов: Dispers, X1, _Flag, _ _.
3.2.2.2 Типы данных
Типом данного называется его характеристика, определяющая:
способ хранения данного в памяти компьютера;
допустимый диапазон значений данного;
способ доступа к данному;
правила записи и использования данного в программе.
Все данные в языке С++ строго типизированы. Разновидности типов данных определяются правилами:
тип данного ::= базовый | модифицированный;
базовый тип ::= char(символьный) | int(целый) | float(действительный) | bool(логический) | void(пустой);
модифицированный символьный тип ::=
([signed(знаковый)] | unsigned(беззнаковый)), (char | wchar_t(широкий));
модифицированный целый тип ::=
([signed] | unsigned), [ ([short(короткий)] | long(длинный)) | long long(очень длинный)) ], [int];
модифицированный действительный тип ::=
(long float | double)(длинный) | long double(расширенный));
Беззнаковые данные могут быть только положительными (включая нулевое значение), а знаковые могут быть и отрицательными.
Данные типа char хранятся в памяти в виде кодов символов (целых чисел), в формате данных типа int, а потому могут иметь знак.
Двухбайтовые символы UNICODE в языке С++ представляются с помощью широких символов типа wchar_t. Детали реализации типа wchar_t зависят от компилятора; при этом может изменяться и количество байтов, которое отводится под код одного символа. Тем не менее, в большинстве случаев используется именно двухбайтовое представление символов.
Модификаторы signed и short типов данных определены по умолчанию и могут опускаться при объявлении данных. Если же в объявлении указан модификатор short или модификатор long, то описатель базового типа int можно опускать.
Допустимый диапазон значений данных различных типов приведен в таблице 3.2.2.
Таблица 3.2.2
Тип данного |
Размер (в байтах) |
Диапазон значений (IA32) |
[signed] char |
1 |
-128 … 127 |
unsigned char |
1 |
0 … 255 |
[signed] [short] int |
2 |
-32 768 … 32 767 |
unsigned [short] int |
2 |
0 … 65 535 |
[signed] wchar_t |
2 |
-32 768 … 32 767 |
unsigned wchar_t |
2 |
0 … 65 535 |
[signed] int |
4 |
-2 147 483 648…21 47 483 647 |
unsigned int |
4 |
0…4 294 967 295 |
[signed] long int |
4 |
-2 147 483 648…21 47 483 647 |
unsigned long int |
4 |
0…4 294 967 295 |
[signed] long long int |
8 |
-(263-1) … (263-1) |
unsigned long long int |
8 |
0…264-1 |
float |
4 |
-3.4·1038 ... +3.4·1038 |
long float или double |
8 |
-1.7·10308 … +1.7·10308 |
long double |
10 |
-3.4·104932... +1.1·104932 |
bool |
1 |
true, false |
На компьютерах с 32-разрядной архитектурой (IA32) типы данных int и long эквивалентны. На компьютерах с 64-разрядной архитектурой (IA64) данные типы long занимают уже 8 байтов памяти и имеют диапазон значений 0… 18 446 744 073 709 551 616 (для unsigned long) и -9 223 371 036 854 775 808 …+9 223 371 036 854 775 807 (для signed long).
Данные логического типа (bool) могут принимать лишь два значения: true (истина) и false (ложь). Однако, кроме этого, в качестве данных логического типа можно использовать и данные целого типа: значение 0 расценивается как false, а любое ненулевое значение - как true.
Для ввода в программу мнемонически осмысленных синонимов вышеперечисленных типов данных может применяться конструкция объявления пользовательского типа данного, согласно правилу:
пользовательский тип данного ::= typedef, тип данного, новый тип
Примеры объявления пользовательских типов данных:
typedef long double Large; // введено новое обозначение «Large» типа «long double»
typedef char Symbol; // теперь при объявлении символьного данного вместо
// описателя «char» можно использовать описатель «Symbol»
В языке С++ имеются квалификаторы типа, определяющие доступность и модифицируемость данных: const, volatile и restrict. Квалификатор типа должен предшествовать наименованию типа данного, который он квалифицирует (уточняет).
Данное, в объявлении которого использован квалификатор const, является постоянной и не может изменять свое значение.
Квалификатор volatile указывает компилятору на то, что значение данного может изменяться не только программно, но и вследствие воздействия еще чего-либо, не являющегося инструкцией данной программы. Например, данное может отображать системное время, изменяемое операционной системой. Данное, в объявлении которого использован квалификатор volatile, может одновременно иметь и квалификатор const. В этом случае значение данного не может изменяться в разрабатываемой программе, но может модифицироваться в зависимости от внешних по отношению к программе факторов.
Квалификатор restrict применяется только к указателям на данные. Указатель, описанный с этим квалификатором, становится единственным средством доступа к данному.