Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование основы языка С++. Учебное пособие
.pdf
РАЗДЕЛ 4
ФУНДАМЕНТАЛЬНЫЕ ТИПЫ ДАННЫХ С++
В C++ есть встроенная поддержка определенных типов данных. Их
называют основными типами данных (или еще «фундаментальные/базовые/встроенные типы данных»). Типы данных в C/C++ разделяются
на основные и производные.
К основным типам относят:
void (пустой тип),
•
int (целый тип),
•
float (вещественные числа с плавающей точкой),
•
double (вещественные числа с плавающей точкой двойной точности),
•
char (символьный тип),
•
bool – логический.
•
Составные типы
Для формирования других типов данных используют основные типы
+ так называемые спецификаторы. Типы данных, созданные на базе
стандартных типов с использованием спецификаторов, называют составными типами данных. В C++ определены четыре спецификатора
типов данных:
short – короткий;
•
long – длинный;
•
signed-знаковый;
•
unsigned-беззнаковый.
•
Производные типы – это:
массивы,
•
функции,
•
классы,
•
указатели,
•
ссылки,
•
структуры,
•
объединения.
•
Основные типы данных показаны в таблице 4.1.
41

Таблица 4.1 – Типы данных
Имя Размер Представляемые
bool 1 байт логические false, true
(signed) char 1 байт символы
wchar_t 2 байта символы
(signed) short int 2 байта целые числа от –32768 до 32767
(signed) int зависит от
(signed) long int 4 байта целые числа от –2147483648 до
(signed) long long int
(signed) __int64 (MS)
unsigned char 1 байт символы
unsigned short int 2 байта целые числа 0 до 65535
unsigned int зависит от
unsigned long int 4 байта целые числа от 0 до 4294967295
(unsigned) long long int
(unsigned) __int64 (MS)
float 4 байта вещественные
double 8 байт вещественные
long double зависит от
реализации
8 байт целые числа от
реализации
8 байт целые числа от 0 до
реализации
значения
целые числа от –128 до 127
Unicode
целые числа
целые числа от 0 до 255
целые числа
числа
числа
вещественные
числа
от 0 до 65535
2147483647
–9,223,372,036,854,775,808
до 9,223,372,036,854,775,807
18,446,744,073,709,551,615
от 1.175494351e–38
до 3.402823466e+38
от 2.2250738585072014e–308
до 1.7976931348623158e+308
Диапазон
Символьный тип. Данные типа char в памяти компьютера всегда за-
нимают 1 байт. Это связано с тем, что обычно под величину символьного типа отводят столько памяти, сколько необходимо для хранения
любого из 256 символов клавиатуры. Символьный тип может быть со
знаком или без знака. В величинах со знаком signed char можно хранить значения в диапазоне от –128 до 127. Соответственно значения
переменных типа unsigned char могут находиться в диапазоне от 0 до
255. При работе с символьными данными нужно помнить, что если в
42

выражении встречается одиночный символ, он должен быть заключен
в одинарные кавычки. Последовательность символов, то есть строка,
при использовании в выражениях заключается в двойные кавычки.
Например: ‘F’, ‘3’ , “Иван”, “235”
Целочисленный тип. Данные типа int в памяти компьютера могут
занимать либо 2, 4 или 8 байт. Это зависит от разрядности процессора.
По умолчанию все целые типы считаются знаковыми, то есть спецификатор signed (знаковый) можно не указывать. Спецификатор unsigned
(беззнаковый) позволяет представлять только положительные числа.
Вещественный тип. Внутреннее представление вещественного числа
в памяти компьютера отличается от представления целого числа. Число
с плавающей точкой представлено в экспоненциальной форме – ± mE ± p,
где m – мантисса (целое или дробное число с десятичной точкой);
р – порядок (целое число).
Для того чтобы перевести число в экспоненциальной форме к обычному представлению с фиксированной точкой, необходимо мантиссу умножить на десять в степени порядок. Например: – 6.42 E +2 =
= – 6.42 ∗ 102.
Длина мантиссы определяет точность числа, а длина порядка его
диапазон. Данные типа float занимают 4 байт, из которых 1 двоичный
разряд отводится под знак, 8 разрядов – под порядок и 23 – под мантиссу. Поскольку старшая цифра мантиссы всегда равна 1, она не хранится.
Данные типа double занимают 8 байт, в них под порядок –11 разрядов
и под мантиссу –52 разряда соответственно. Спецификатор типа long
перед именем типа double указывает, что под величину отводится 10 байт.
Логический тип. Переменная типа bool может принимать только два
значения true (истина) или false (ложь). Любое значение, не равное нулю,
интерпретируется как true, а при преобразовании к целому типу принимает значение, равное 1. Значение false представлено в памяти как 0.
Тип void (пустой). Множество значений этого типа пусто. Тип void
используется для:
определения функций, которые не возвращают значения;
•
для указания пустого списка аргументов функции;
•
как базовый тип для указателей;
•
в операции приведения типов.
•
В языке C++ также существуют перечислимый тип – enum, который является подмножеством целого типа, и пустой тип – void, который имеет специальное назначение. Он используется для объявления
43

функций, которые не возвращают никакого значения, а также для объявления указателей на значение типа void. Такие указатели могут быть
преобразованы к указателям на любой другой тип.
В языке С++ можно объявлять структуры и так называемые объ-
единения.
В языке C++ нет специальных типов для массивов и строк, которые
представляются массивом символов.
В языке С не существовало логического типа. Логические значения
представлялись данными целого типа, при этом значение 0 соответствовало логическому значению ложь, а все остальные целые значения соответствовали логическому значению истина. В языке С++ сохранена
данная логика. По определению, true имеет значение 1 при преобразова-
нии к целому типу, а false – значение 0. И наоборот, целые можно неявно
преобразовать в логические значения: при этом ненулевые целые преобразуются в true, а ноль – в false. В любом месте, где требуется логическое
значение, может стоять целочисленное выражение. В арифметических
и логических выражениях логические значения преобразуются в целые,
операции выполняются над преобразованными величинами.
Указатель можно неявно преобразовать в логическое значение, при
этом ненулевой указатель принимает значение true, нулевой – false.
Такой подход позволяет вместо логической и целочисленной переменных объявлять только целочисленную, при этом значение переменной, равное 0, говорит об отсутствии некоторого признака у объекта, а
остальные значения говорят о его наличии, и при этом несут какую-либо
дополнительную информацию.
При выполнении бинарных операций производятся преобразования
по умолчанию для приведения операндов к одному и тому же типу, который потом используется как тип результата:
1. Если один из операндов имеет тип long double, другой тоже пре-
образуется в long double;
иначе, если один операнд имеет тип double, то второй операнд
•
преобразуется к типу double;
иначе, если один операнд имеет тип float, то второй операнд пре-
•
образуется к типу float;
иначе над обоими операндами производится интегральное продви-
•
жение, а именно: значения типов char, signed char, unsigned char, short
int и unsigned short int преобразуются в int, если int может представить
все значения исходных типов, в противном случае они преобразуются
в unsigned int; bool преобразуется в int.
44

2. Затем если один операнд имеет тип unsigned long, то второй опе-
ранд преобразуется к типу unsigned long;
иначе, если один из операндов относится к типу long int, а другой
•
к типу unsigned int, то если long int может представить все значений
типа unsigned int, unsigned int преобразуется в long int, иначе оба опе-
ранда преобразуются в unsigned long int;
иначе, если один операнд имеет тип long int, то второй операнд
•
преобразуется к типу long int;
иначе, если один операнд имеет тип unsigned int, то второй операнд
•
преобразуется к типу unsigned int;
иначе оба операнда имеют тип int.
•
В языке С++ нет операций преобразования между символом и кодом
символа, т.к. в оперативной памяти символ и так храниться в виде его
кода. Поэтому можно к переменной, хранящей символ, прибавить 1 и
получить следующий символ.
4.1 Объявление переменных
Переменная – это поименованный участок памяти, в котором хранится значение определенного типа. У переменной есть имя (иденти-
фикатор) и значение. Имя служит для обращения к области памяти, в
которой хранится значение.
Имя (идентификатор) – это совокупность букв, цифр и знаков подчеркивания, задающая имя переменной, название функции или ключевое слово в программе. Язык С/C++ чувствителен к регистру (т.е. Sum
и sum будут восприниматься как две разные переменные):
тип имя [=инициатор];
где, тип – ключевое слово, определяющее объем памяти (число байтов), выделенный для хранения значения переменной (как объекта
программы), (int – целый, float, double – вещественный, char – символьный, bool – логический); имя – уникальный идентификатор переменной, задающий символический адрес объекта программы в памяти
ЭВМ; инициатор – начальное значение переменной, которое может
отсутствовать в описании.
Например:
int k, max=0;
float r2, p1=0.5;
double z5_1;
unsigned int year=2000;
char sim=’x’, bell=’\a’;
45

Однотипные переменные можно сгруппировать, разделив «,».
Описание переменных разного типа разделяется « ; ». По месту обьявления переменные в языке С/С++ можно разделить на три класса:
локальные – объявляются внутри функции и доступны только в ней;
глобальные – описываются до всех функций и доступны из любого
места программы;
формальные параметры функций описываются в списке параметров
функции.
Пример:
float s; //Определена глобальная переменная s (типа float).
int main ()
{ float s; //В функции main определена вещественная переменная s
s=4.5; //и ей присвоено значение 4.5.
}
int fl()
{ int s; //в функции fl описана другая переменная s типа int,
s=6; //ей присвоено значение 6
}
int f2()
{ long int s //В функции f2 определена еще одна переменная s
s=25; //(типа long int), и ей присвоено значение 25.
}
4.2 Алфавит языка С++
Алфавит языка C++ составляют символы включенные в 7-битную
кодировку ISO 646/ECMA-6:
space, !, ", %, &, (, ), *, +, –, ., /, 0..9, :, ;, <, =, >, ?, A..Z, _, a..z.
Часть символов, используемых в алфавите C++, не входит в кодовую
базу этой кодировки:
{, }, [, ], #, \, ^, |, ~.
4.3 Лексема
Символы алфавита образуют лексемы. Лексема (token) – это минимальная единица языка, имеющая самостоятельный смысл. Лексемы –
формируют базовый словарь языка, понятный компилятору. Всего существует пять видов лексем:
ключевые слова (keywords);
•
46

идентификаторы (identifiers);
•
литералы (literals);
•
операции (operators);
•
знаки пунктуации (разделители, punctuators).
•
Лексемы (как и слова в естественном языке) разделяются непечатаемыми (пробельными) символами (пробел, символы табуляции, перевода
строки, возврат каретки, перевода страницы) и знаками пунктуации:
[, ], (, ), {, }, *, ,, :, =, ;, ..., #.
4.4 Идентификаторы
Идентификатор – это имя программного объекта: переменной, константы, массива, функции, класса и т. п. В идентификаторах могут использоваться латинские буквы, цифры и знак нижнего подчеркивания
( _ ). В C++ различаются строчные и прописные буквы (т. е. имена
регистро-зависимы), так: Name, name и NAME – это разные идентифи-
каторы. Правила использования идентификаторов:
можно использовать латинские символы: A...Z, a...z;
•
можно использовать арабские цифры: 0...9 и символ нижнего под-
•
черкивания, но не в начале;
пробелы в имени не допускаются;
•
не рекомендуется начинать с нижнего подчеркивания или с двух
•
нижних подчеркиваний и заглавной буквы, например: _S (такие
идентификаторы имеют специальное назначение);
двойное подчеркивание используется только для служебных целей
•
to__boo
не допускается использования ключевых слов;
•
необходимо воздерживаться от использования ключевых слов, как
•
части имени, например: for_and_if (за исключением наименования
типов)
При составлении имен желательно придерживаться какого-либо
стиля, например, стиля CamelCase: имена пишутся слитно, каждое слово, описывающее назначение идентификатора, пишется с заглавной
буквы. Этот стиль используется в двух вариантах: UpperCamelCase и
lowerCamelCase. Первый используется для именования классов, второй
для прочего: переменных, методов и т.п.
4.5 Ключевые слова
Ключевые слова – это лексемы специального назначения. Они зарезервированы, использовать их в качестве идентификаторов запрещено:
47

alignas
alignof
and
and_eq
asm
atomic_cancel
atomic_commit
atomic_noexcept
auto
bitand
bitor
bool
break
case
catch
char
char8_t
char16_t
char32_t
class
compl
concept
const
consteval
constexpr constinit
const_cast
continue
co_await
co_return
co_yield
decltype
default
delete
do
double dynamic_cast else
enum
explicit
export
extern
false
float
for
friend
goto
if
inline int
long
mutable
namespace
new
noexcept
not
not_eq
nullptr
operator
or
or_eq
private
protected
public
requires
return
reflexpr
register
reinterpret_cast
short
signed
sizeof
static static_assert
static_cast
struct
switch
synchronized
template
48

this
thread_local
throw
true
try
typedef
typeid
typename
union
unsigned
using
virtual
void
volatile
wchar_t
while
xor
xor_eq
4.6 Литералы
Литералы, иначе констант•ы – это неизменяемые величины.
Примеры различных констант:
Целые
Без суффикса: 0, –1, 10000
По умолчанию целочисленные лексемы имеют тип int. Суффиксы
позволяют изменить тип.
С использованием суффиксов (суффиксы не чувствительны к регистру): 2015u, 100000ULL
u – unsigned int
•
l – long
•
ul – unsigned long
•
ll – long long
•
ull – unsigned long long
•
Примечание: поскольку компилятор определяет тип данных константы по ее внешнему виду – суффиксы подсказывают компилятору какой
тип данных необходимо использовать: так, если константа 100 займет в
памяти 4 байта (тип int), то 100LL займет уже 8 байтов памяти.
Представление целых литералов в различных системах счисления
(также можно использовать суффиксы):
Двоичной: 0b1010, 0B111100111
•
Восьмеричной: 01, 020, 07155
•
Шестнадцатеричной: 0xA, 0x1B8, 0X00FF
•
Действительные
С фиксированной точкой: 5.7, .001, –35., 0.0
С плавающей точкой (экспоненциальный): –0.2E6, .11e-3, 5E10,
2.e-10
49

По умолчанию они имеют тип double. Для явного указания типа
float нужно использовать суффикс F или f, а для long double – L или l,
но только в случае записи с десятичной точкой:
3.14159F, 12.345L
Примечание: стандарт C++14 ввел использование апострофа для произвольного разделения разрядов в числовых литералах: 0b0100’1100’0110,
0.000’015’3
Символьные. Один или два символа заключенные в апострофы: 'S',
'щ', '\t', '\012', '\x07\x07', 'db'
Примечание: к символьным константам относятся специальные управляющие символы (escape-последовательности).
Escape-последовательности. Escape-последовательности (или управляющие последовательности) используются для описания определенных специальных символов внутри строковых литералов, то есть внутри
ограничителей "". Полный список приведен в методичке (Таб. 12). Вот
некоторые из них:
\n – новая строка
•
\t – горизонтальная табуляция
•
\v – вертикальная табуляция
•
\0 – нулевой символ
•
Строковые. Последовательность символов, заключенные в кавычки:
"Hello world!", "Здесь был Вася :-))". К строковому литералу автоматически добавляется признак конца строки ('\0').
Суффиксы (чувствительны к регистру) в зависимости от типа неASCII символа:
L"a wide string literal"
•
u8 – char8_t (unicode, начиная с C++20)
•
u – char16_t (unicode)
•
U – char32_t (unicode)
•
L – wchar_t (широкий символ)
•
R – сырая строка: R"&%$(string with \backslash)&%$"
•
Примечание:В сырой строке могут быть символы /, ' и ". Префикс R может быть использован в сочетании с любыми другими, например: RU, Ru8.
Прочие
Булевские (логические): false, true
Нулевой указатель: nullpt
Литералы, определенные пользователем. Для удобства и придания
программе более лаконичного и изящного вида можно создавать свои
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
