Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование основы языка С++. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
РАЗДЕЛ 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]