ЛЕКЦИЯ 2
Алфавит, синтаксис, семантика языка программирования С++
Словами языка являются неделимые, с точки зрения синтаксиса языка, последовательности знаков алфавита. Слова по-другому
В любом месте программы, где следует поместить один разделитель, их можно поместить любое количество и в любом сочетании. Это
Алфавит языка С++ ·  A..Z - прописные (с кодами от 65 до 90) буквы латинского алфавита; ·  a..z - строчные (с кодами от 97 до
·  символ подчеркивания _ ·   специальные символы: . , : ; ‘ “ #   ·   скобки { } [ ] ( ) ·    знаки    < > & | ^ ! + - / * % =
· некоторые символы могут обозначаться специальным образом: \? – знак вопроса; \’ – апостроф; \” – кавычки; \\ – обратная косая
·  кроме того, каждый символ может быть обозначен своим кодом в 8-ой или 16-ой системе счисления: \ddd – где буквы ddd
·        Дополнительно в языке используются управляющие символы, или escape-последовательности – это такие символы, при вставке
Ключевые слова это такие слова, которые имеют предопределенное значение в языке и их нельзя использовать для других целей.
Идентификаторы Идентификаторы формируются по следующим правилам:         должны начинаться с буквы или со знака подчеркивания;
Структура программы на языке C++
Пример программы на C++
Пример программы на C++
Пример программы на C++
Пример программы на C++
Пример программы на C++
Пример программы на C++
Пример программы на C++
Пример программы на C++
Пример программы на C++
Пример программы на C++
Пример программы на C++
Пример программы на C++
Типы данных
Основные типы данных
Типы данных
Символьный тип char16_t и char32_t
Типы целых чисел, зависящие от Майкрософт
Упр. Посмотреть размеры типов
Результаты для Visual Studio 17
Диапазоны значений основных типов языка С++
Спецификатор auto
Спецификатор auto
Спецификатор decltype
Использование decltype(auto)
Понятие переменной и константы Переменная – это поименованная область памяти, в которой хранятся данные определённого типа.
Целые константы Десятичная целая константа, если она не нуль, записывается как последовательность десятичных цифр. Старшая
Всем вещественным константам по умолчанию компилятор будет присваивать тип double, для которого в памяти компьютера будет
'\a' сигнал-звонок '\b' возврат на одну позицию (на один символ) '\f' новая станица, перевод страницы '\n' новая строка,
Примеры самоопределённых констант (литералов)
324.20K
Category: programmingprogramming

2.Основы С без перем

1. ЛЕКЦИЯ 2

1

2. Алфавит, синтаксис, семантика языка программирования С++

• алфавит – совокупность допустимых в
языке символов или групп символов,
рассматриваемых как единое целое;
• синтаксис – система правил, по которым
записываются конструкции языка;
• семантика – набор правил, на основе
которых следует истолковывать, т.е.
объяснять
смысл
и
назначений
конструкций языка.
2

3. Словами языка являются неделимые, с точки зрения синтаксиса языка, последовательности знаков алфавита. Слова по-другому

называют
лексемами.
Лексема – минимальная единица языка,
имеющая самостоятельный смысл.
Слова разделяются между собой
символами-разделителями или
пробельными символами (знаки пробела,
табуляции, backspace, return, перехода на
следующую строку и страницу).
3

4. В любом месте программы, где следует поместить один разделитель, их можно поместить любое количество и в любом сочетании. Это

свойство применяется для
более
наглядного
представления
структуры программы, ибо в хорошо
структурированной программе легче
искать ошибки при ее отладке, а также
проще вносить изменения в алгоритм.
4

5.

Среди лексем выделяют:
- символы (простые и составные)
- символы-разделители
- специальные символы
- ключевые слова
- идентификаторы
- константы
- инструкции
- комментарии
- операторы
5

6. Алфавит языка С++ ·  A..Z - прописные (с кодами от 65 до 90) буквы латинского алфавита; ·  a..z - строчные (с кодами от 97 до

Алфавит языка С++
A..Z - прописные (с кодами от 65 до
90) буквы латинского алфавита;
a..z - строчные (с кодами от 97 до
122) буквы латинского алфавита,
0..9 - арабские цифры (с кодами от
48 до 57);
6

7. ·  символ подчеркивания _ ·   специальные символы: . , : ; ‘ “ #   ·   скобки { } [ ] ( ) ·    знаки    < > & | ^ ! + - / * % =

символ подчеркивания _
специальные символы:
. , : ; ‘ “ #
скобки { }
[ ]
( )
знаки < > & | ^ ! + / * % =
пробельные символы: пробел, символ
табуляции, символ перевода строки,
backspace;
нулевой символ или «пусто»
(nullptr)
7

8. · некоторые символы могут обозначаться специальным образом: \? – знак вопроса; \’ – апостроф; \” – кавычки; \\ – обратная косая

некоторые символы могут
обозначаться специальным образом:
\? – знак вопроса;
\’ – апостроф;
\” – кавычки;
\\ – обратная косая черта;
\0 – пусто.
8

9. ·  кроме того, каждый символ может быть обозначен своим кодом в 8-ой или 16-ой системе счисления: \ddd – где буквы ddd

кроме того, каждый символ может
быть обозначен своим кодом в 8-ой или
16-ой системе счисления:
\ddd – где буквы ddd обозначают код
символа в 8-ой (восьмеричной) с/c;
\xdd – где буквы dd обозначают код
символа в 16-ой (шестнадцатеричной)
с/c.
9

10. ·        Дополнительно в языке используются управляющие символы, или escape-последовательности – это такие символы, при вставке

Дополнительно в языке
используются управляющие символы,
или escape-последовательности – это
такие символы, при вставке в текст
которых происходит некоторое
действие.
Например:
\n - новая строка, перевод строки.
\r - возврат каретки в начало строки
\t - горизонтальная табуляция
\v -вертикальная табуляция
10

11. Ключевые слова это такие слова, которые имеют предопределенное значение в языке и их нельзя использовать для других целей.

Иначе их называются
служебными словами (keywords). Они
используются для обозначения как
операторов языка, так и для
организации правильной работы
компилятора.
11

12.

12

13.

Синонимы расширенных операторов
являются также ключевыми словами:
В версии С++20 добавлены следующие
ключевые слова:
13

14. Идентификаторы Идентификаторы формируются по следующим правилам:         должны начинаться с буквы или со знака подчеркивания;

Идентификаторы
Идентификаторы формируются по
следующим правилам:
должны начинаться с буквы или со знака
подчеркивания;
состоят из последовательности букв,
цифр и знаков подчеркивания;
допускается любая длина
идентификатора, но некоторые компиляторы
налагают на нее ограничения; например, в
некоторых компиляторах максимальное
значение – 31;.
14

15.

Прописные и строчные буквы в
словах языка различаются в отличие от
Pascal и Delphi.
Так a1 и A1 – два разных
идентификатора, так как заглавные и
строчные буквы различаются.
Запрещается использовать в
качестве идентификаторов
зарезервированные ключевые слова и
имена стандартных функций.
15

16.

Примеры допустимых
идентификаторов :
Label2, Block_Calcul, A1, а1, Stop2,
Do_Goto_Output, ASDF, aSDF, _, __,
q12345678
Недопустимые идентификаторы :
1_th_Block, lab+1, 1234567, Лето,
Блок 5б, R.89, W..Z.
16

17.

Для
улучшения
читаемости
программы стоит давать идентификаторам
осмысленные имена.
Для удобства чтения можно разделять
слова в имени знаком подчеркивания:
Max_Length, number_of_types.
Или
пользоваться
“верблюжьей”
нотацией: отдельные слова в именах
начинать с большой буквы:
MaxLength, NumberOfTypes.
17

18.

В
большинстве
учебников
рекомендуется пользоваться т.н. венгерской
нотацией, согласно которой каждый
идентификатор начинается с префикса,
поясняющий тип или множество значений
данной величины. Так, допустимыми
именами, согласно такой нотации, являются
iMaxValue, szNewName и т.д. (здесь i –
признак целочисленности, sz – нультерминированной строки).
18

19.

Не рекомендуется:
идентификаторы начинать с символа подчеркивания,
поскольку с него начинаются системные
зарезервированные переменные и константы и многие
имена в библиотечных функциях;
использовать в одной программе идентификаторы со
схожим начертанием букв (например, l1, I1 и Il; SO и
S0);
использовать похожие идентификаторы для обозначения
разных по смыслу объектов, например, если для
организации циклов используются обозначения i, i1, j, то
не стоит обозначать переменную строкового типа как j1;
19

20.

В следующем примере
int max(int x, int y)
{
if (x > y)
return x;
else
return y;
}
max, x и y – имена или идентификаторы.
int, if, return и else – ключевые
слова
20

21.

Комментарии
Комментарий – это предложение на
естественном языке, которое поясняет ход
выполнения программы. Комментарии
могут характеризовать используемый
алгоритм, пояснять назначение тех или
иных переменных, разъяснять сложные
места. При компиляции комментарии
выкидываются из текста программы,
поэтому размер получающегося
исполняемого модуля не увеличивается.
© 2023 Конах В.В
21

22.

Пример комментариев языка С.
Такой комментарий может занимать одну или
несколько строк.
s=0;
for (i = 0; i < n; i++)
{
if (a[i] < 0)
/* пропуск отрицательных элементов */
continue;
s=s+a[i]; /* суммирование
положительных элементов */
}
22

23.

Этот тип комментариев сохранился и в
С++. Но в С++ есть и второй тип:
однострочный комментарий, начинается
последовательностью символов // и
ограничен концом строки.
s=0;
for (i = 0; i < n; i++)
{
if (a[i] < 0)
// пропуск отрицательных элементов
continue;
s=s+a[I]; //суммирование
положительных
}
23

24. Структура программы на языке C++

В состав программы входят:
директивы препроцессора
инструкции
комментарии
24

25. Пример программы на C++

// программа вводит с консоли число
// и выводит его на консоль
#include <iostream>
using namespace std;
int main()
{
int a;
cout << "input number\n";
cin >> a;
cout << "number=" << a << "\n";
return 0;
}
25

26. Пример программы на C++

// программа вводит с консоли число
// и выводит его на консоль
комментарий
#include <iostream>
using namespace std;
int main()
{
int a;
cout << "input number\n";
cin >> a;
cout << "number=" << a << "\n";
return 0;
}
26

27. Пример программы на C++

// программа вводит с консоли число
// и выводит его на консоль
директива
#include <iostream>
препроцессор
а
using namespace std;
int main()
{
int a;
cout << "input number\n";
cin >> a;
cout << "number=" << a << "\n";
return 0;
}
27

28. Пример программы на C++

// программа вводит с консоли число
// и выводит его на консоль
оператор
#include <iostream>
подключения
пространства
using namespace std;
имён
int main()
{
int a;
cout << "input number\n";
cin >> a;
cout << "number=" << a << "\n";
return 0;
}
28

29. Пример программы на C++

// программа вводит с консоли число
// и выводит его на консоль
определение
#include <iostream>
функции main
using namespace std;
int main()
{
int a;
cout << "input number\n";
cin >> a;
cout << "number=" << a << "\n";
return 0;
}
29

30. Пример программы на C++

// программа вводит с консоли число
// и выводит его на консоль
#include <iostream>
using namespace std;
int main()
начало блока
{
int a;
cout << "input number\n";
cin >> a;
cout << "number=" << a << "\n";
return 0;
}
30

31. Пример программы на C++

// программа вводит с консоли число
// и выводит его на консоль
#include <iostream>
using namespace std;
int main()
{
определение
int a;
переменной a
cout << "input number\n";
cin >> a;
cout << "number=" << a << "\n";
return 0;
}
31

32. Пример программы на C++

// программа вводит с консоли число
// и выводит его на консоль
#include <iostream>
using namespace std;
int main()
{
Вывод текста
int a;
в поток cout
cout << "input number\n";
cin >> a;
cout << "number=" << a << "\n";
return 0;
}
32

33. Пример программы на C++

// программа вводит с консоли число
// и выводит его на консоль
#include <iostream>
using namespace std;
int main()
{
int a;
cout << "input number\n";
Ввод данных
в переменную
cin >> a;
a
cout << "number=" << a << "\n";
return 0;
}
33

34. Пример программы на C++

// программа вводит с консоли число
// и выводит его на консоль
#include <iostream>
using namespace std;
int main()
{
int a;
вывод в поток
cout << "input number\n";
cout
cin >> a;
cout << "number=" << a << "\n";
return 0;
}
34

35. Пример программы на C++

// программа вводит с консоли число
// и выводит его на консоль
#include <iostream>
using namespace std;
int main()
{
int a;
cout << "input number\n";
cin >> a;
cout << "number=" << a << "\n";
завершение
return 0;
функции и
}
возврат
результата
35

36. Пример программы на C++

// программа вводит с консоли число
// и выводит его на консоль
#include <iostream>
using namespace std;
int main()
{
int a;
cout << "input number\n";
cin >> a;
cout << "number=" << a << "\n";
return 0;
}
конец блока
36

37.

#include <iostream>
Для русского
текста
using namespace std;
int main()
{
setlocale(LC_ALL,".1251");
//или setlocale(LC_ALL,"Russian");
int a;
cout << "введите число\n";
cin >> a;
cout << "число=" << a << "\n";
return 0;
}
37

38.

#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
// Изм кодировки консоли для вывода русского текста:
system("chcp 1251 > nul" );
// если использовать system("chcp 1251" );
//на экране будет сообщ "Текущая кодовая страница: 125
// Отображение сообщения в консоли:
cout << "Программируем на С++!" << endl;
// Задержка консольного окна:
system("pause");
// на экране "Для продолжения нажмите любую клавишу...
// если поставите system("pause>nul");
// этого сообщения не будет
return 0;
}
38

39. Типы данных

Тип данных определяет:
внутреннее представление данных в
памяти компьютера;
множество допустимых значений
величин этого типа;
совокупность операций и функций,
которые можно применять к величинам
этого типа.
39

40. Основные типы данных

С++
предоставляет
набор
встроенных (стандартных) типов данных:
символьный,
целый,
вещественный,
логический и набор составных и
расширенных типов: строки, массивы,
перечисления, классы и т.д.
Встроенные
(базовые)
типы
данных предопределены в языке. Это
самые простые величины, из которых
составляют все производные типы.
40

41.

основные (базовые) типы:
int (целый)
char (символьный)
wchar_t (расширенный символьный)
char16_t (символьный) –для Unicode
char32_t (символьный) –для Unicode
bool (логический)
float (вещественный тип, или число с
плавающей точкой одинарной точности)
double (вещественный с двойной
точностью, или число с плавающей точкой
двойной точности)
41

42.

Логический, символьный, целый,
типы
называют
целочисленными
(целыми), последние два – типами с
плавающей точкой.
Внутреннее представление целых
типов и типов с плавающей точкой
различно.
42

43.

Для уточнения внутреннего
представления данных и диапазона
значений используются ключевые слова
(в различной литературе их называют
по-разному: модификаторы,
спецификаторы):
short (короткий)
long (длинный)
signed (знаковый)
unsigned (беззнаковый)
43

44. Типы данных

Категория
Логический тип данных
Символьный тип данных
Целочисленный тип данных
Тип данных с плавающей
запятой
Тип
Минималь- Наш
ный размер случай
bool
1 байт
1 байт
char
1 байт
1 байт
wchar_t 2 байта
2 байт
4 байта (Linux)
char16_t 2 байта
2 байта
char32_t 4 байта
4 байта
short
2 байта
2 байта
int
2 байта
4 байта
long
4 байта
4 байта
long long 8 байт
8 байт
float
4 байта
4 байта
double
long
double
8 байт
8 байт
8 байт
8 байт
44

45.

Логический тип (bool)
Величины логического (булевского)
типа (bool) принимают значения true
(истина) или false (ложь) и занимают
в нашем случае один байт памяти.
Значение false представляется в
компьютере как 0, а любое другое
значение трактуется как true и при
преобразовании к целому типу имеет
значение 1.
45

46.

Символьный тип (char)
Символьный тип занимает 1 байт (8
битов). Так как этот тип относится к
целым, то он может быть со знаком и
без знака. Поэтому unsigned char имеет
диапазон значений от 0 до 255, a signed
char – от -128 до 127. Являются ли
значения типа просто char знаковыми
или
беззнаковыми,
зависит
от
реализации.
46

47.

Расширенный символьный тип (wchar_t)
предназначен для работы с набором символов,
для кодировки которых недостаточно 1 байта,
например Unicode. Размер этого типа зависит от
реализации, как правило, в системах Microsoft он
соответствует типу short:
2 байта (16 битов).
Может хранить любое значение из диапазона
от 0 до 65 535.
В системах Linux – 4 байта и может хранить
значения от 0 до 4 294 967 295.
Строковые константы этого типа записываются
с префиксом L, например:
L”Hello”
L”кодировка”
47

48. Символьный тип char16_t и char32_t

В стандарте С++11 были добавлены
типы char16_t и char32_t, которые
ориентированы на использование
Unicode. Они занимают в памяти 2
байта (16 бит) и 4 байта (32 бита)
соответственно.
48

49.

Однако на уровне ОС пока не
реализованы потоки для работы с
этими типами. Поэтому если
потребуется вывести на консоль
значения переменных этих типов, то
необходимо преобразовать
переменные к типам char или
wchar_t.
49

50.

#include <iostream>
int main() {
char a = 'd';
wchar_t b = 'e';
char16_t c = 's';
char32_t d = 'k';
std::cout << a <<
static_cast<char>(b)<<
static_cast<char>(c)<<
static_cast<char>(d)<<
"\n";
return 0;
}
При выводе перед переменными указывается операция
приведения к типу char, в итоге переменные b, c и d преобразуются в
тип char и могут быть выведены на консоль с помощью потока cout.
50

51.

Целый тип (int)
Размер типа int не определяется
стандартом языка, а зависит от компьютера и
компилятора. Для 16-разрядного процессора
под величины этого типа отводятся 2 байта
( от –32768 до 32767 ), для 32-битового – 4
байта (от −2 147 483 648 до 2 147 483 647 ).
51

52.

Целый тип (long)
Представляет целое число в
диапазоне от −2 147 483 648 до
2 147 483 647.
Занимает в памяти 4 байта
(32 бита).
52

53.

Целый тип (long long )
Представляет целое число в
диапазоне от
−9 223 372 036 854 775 808
до
+9 223 372 036 854 775 807.
Занимает в памяти, как правило,
8 байт (64 бита).
53

54.

Для
представления
целого,
описанного с модификатором short,
чаще всего отводится 2 байта (16 бит),
с модификатором long – 4 байта (32
бита).
В любом случае значения типов
short и int представляются по крайней
мере 16 битами; типа long - по крайней
мере 32 битами; размер short не
больше размера int, который в свою
очередь не больше размера long.
54

55.

Для
16-битового
процессора
эквивалентны int и short int,
для 32-битового – int и long int.
В объявлениях
short int summa;
long int counter;
слово int можно опускать, что
обычно и делается:
short summa;
long counter;
55

56.

Если только не возникает противоречий
со здравым смыслом, short int и long
int должны быть разной длины, а int
соответствовать естественному размеру
целых на данной машине.
По умолчанию все целочисленные типы
являются знаковыми, т.е. квалификатор
signed можно опускать.
Величины, описанные с unsigned
всегда положительны или равны нулю.
56

57.

В объявлениях слово signed int,
unsigned int слово int можно
опускать. Объявления
signed int summa1;
unsigned int counter1;
и
signed summa1;
unsigned counter1;
эквивалентны.
57

58. Типы целых чисел, зависящие от Майкрософт

включают определение ширины
__int8, __int16__int32 и __int64 типы.
Эти типы могут использовать
модификаторы signed и unsigned.
__int8 аналогичен типу char,
__int16 — типу short,
__int32 — типу int,
__int64 — типу long long.
58

59.

Начиная с С++11, в стандарт языка
добавлены целочисленные типы
фиксированной ширины:
int8_t, uint8_t, int16_t, uint16_t,
int32_t, uint32_t, int64_t,
uint64_t,
которые гарантированно будут иметь
одинаковый размер в любой
архитектуре. К ним можно получить
доступ, включив заголовочный
файл cstdint, где они определены
внутри пространства имен std.
59

60.

Целочисленные типы фиксированной
ширины имеют два недостатка:
1. они существуют только в том
случае, если есть базовые типы,
соответствующие их ширине и следующие
определенному двоичному представлению.
Использование целочисленного типа
фиксированной ширины делает код менее
переносимым, он может не
компилироваться в других системах;
2. на некоторых архитектурах могут
работать медленнее, чем более широкие
типы.
60

61.

Чтобы устранить эти недостатки, в C++11
дополнительно определены два альтернативных
набора целочисленных типов:
– быстрый тип (std::int_fast#_t) обеспечивает
самый быстрый целочисленный тип со знаком с
шириной не менее # бит (где # = 8, 16, 32 или 64).
Например, std::int_fast32_t предоставит
самый быстрый целочисленный тип со знаком,
имеющий как минимум 32 бита.
– наименьший по размеру тип (std::int_least#_t)
предоставляет наименьший по размеру
целочисленный тип со знаком с шириной не менее
# бит (где # = 8, 16, 32 или 64). Например,
std::int_least32_t предоставит
наименьший целочисленный тип со знаком,
имеющий как минимум 32 бита.
61

62. Упр. Посмотреть размеры типов

#include <cstdint>
#include <iostream>
using namespace std;
int main() {
cout << "fast 8: " << sizeof(int_fast8_t) * 8
<< " bits\n";
cout << "fast 16: " << sizeof(int_fast16_t) * 8
<< " bits\n";
cout << "fast 32: " << sizeof(int_fast32_t) * 8
<< " bits\n";
cout << "least 8: " << sizeof(int_least8_t) * 8
<< " bits\n";
cout << "least 16: " << sizeof(int_least16_t) * 8
<< " bits\n";
cout << "least 32: " << sizeof(int_least32_t) * 8
<< " bits\n";
return 0;
}
62

63. Результаты для Visual Studio 17

fast 8: 8 bits
fast 16: 32 bits
fast 32: 32 bits
least 8: 8 bits
least 16: 16 bits
least 32: 32 bits
63

64.

Существует также набор быстрых
и минимальных по размеру типов без
знака
std::uint_fast#_t
и
std::uint_least#_t
64

65.

Чтобы не писать длинный список для
определения типа можно воспользоваться
ключевым
словом
typedef
для
определения синонима:
так вместо
объявлений
unsigned short int a,b;
unsigned short int x1, x2, x3;
написать
typedef unsigned short USHORT;
USHORT a,b;
USHORT x1, x2, x3;
65

66.

Типы с плавающей точкой
Стандарт языка С++ определяет три
типа
данных
для
работы
с
вещественными числами: float,
double и long double. Типы
данных с плавающей точкой в
компьютере хранятся в виде мантиссы
и порядка.
66

67.

В IBM-совместимых компьютерах
тип float занимает 4 байта (32
бита): один разряд под знак числа, 8
разрядов под порядок и 23 под
мантиссу. Мантисса – это число
большее 1.0, но меньшее 2.0.
Поскольку старшая цифра мантиссы
всегда равна 1, она не хранится.
Диапазон от - 3.4E-38 до 3.4E+38.
67

68.

Тип double предназначен для
арифметики
с
плавающей
точкой
повышенной точности, занимает 8 байт,
под порядок и мантиссу в нем отводится 11
и 52 разряда соответственно.
Диапазон +/- 1.7E-308 до 1.7E+308.
Представление long double
идентично double (8 байт), однако это
разные типы.
В стандарте ANSI диапазоны значений
для основных типов не задаются,
определяются только соотношения
между их размерами, например:
sizeof(float) ≤ slzeof(double) ≤ sizeof(long double)
sizeof(char) ≤ slzeof(short) ≤ sizeof(int) ≤ sizeof(long)
68

69.

В C++ Visual Studio
long
double
аналогичен
double, однако это разные типы.
long float так же аналогичен
double, только в этом случае при
компиляции выдается предупреждение
о нестандартном использовании
модификатора.
69

70.

В
разных реализациях размеры
целых и
вещественных типов могут быть разными.
Минимальные и максимальные допустимые
значения для целых типов приведены в
заголовочном файле <limits.h> (<climits>),
характеристики вещественных типов — в
файле <float.h> (<cfloat>), а также в шаблоне
класса numeric_limits.
Именованные константы для всех размеров
вместе с другими характеристиками машины и
компилятора содержатся в стандартных
заголовочных файлах <limits.h> и <float.h>.
70

71.

Константы с плавающей точкой по
умолчанию имеют тип double.
Можно явно задавать тип константы:
2e+2 – тип double
2e+2L – тип long double
2e+2f – тип float
71

72. Диапазоны значений основных типов языка С++

Тип
Длина в
байтах
Диапазон
char
8
-128..127
int
16 или 32
-32768..32767
– 2147483648..+ 2147483647
float
32
3.4*10-38..3.4*1038
double
64
1.7*10-308..1.7*10308
72

73.

Диапазоны значений типов языка С++ в Visual
Studio
Байт
char
от -128 до +127
Байт
без знака
unsigned
char
от 0 до 255
Короткое
целое число
short
от –32 768 до +32 767
Короткое
целое число
без знака
unsigned
short
от 0 до 65 535
Целое число
int
от – 2 147 483 648 до + 2 147 483 647
Целое число
без знака
unsigned int,
unsigned
от 0 до 4 294 967 295
73

74.

Длинное целое число
long
от – 2 147 483 648 до + 2 147 483 647
Длинное целое число без
знака
unsigned
long
от 0 до 4 294 967 295
Целое число
__intn
8, 16, 32, 64 или 128 бит в зависимости
от значения n. __intn относится только к
системам Microsoft.
Целое число длинное
long long
Аналогично параметру __int64.
Вещественное число
одинарной точности
float
от ±3.4e-38 до ±3.4e+38
(7 значащих цифр)
Вещественное число
двойной точности
double
от ±1.7e-308 до ±1.7e+308
(15 значащих цифр)
Вещественное число
увеличенной точности
long double
от ±1.7e-308 до ±1.7e+308
(15 значащих цифр)
Логическое значение
bool
значения true(истина) или false (ложь)
74

75.

Тип void
В языке C существует тип данных,
который обозначает пустое значение:
void. Он используется для:
определения функций, которые не
возвращают значения,
для указания пустого списка
аргументов функции;
как базовый тип для указателей;
в операциях приведения типов.
Эти вопросы будут рассмотрены
позже.
76

76.

Спецификатор auto
Иногда трудно определить тип выражения. И согласно
последним стандартам можно предоставить
компилятору самому выводить тип объекта. Для этого
применяется спецификатор auto. При определении
переменной со спецификатором auto, эту переменную
нужно обязательно инициализировать каким-либо
значением:
auto number = 5;
На основании присвоенного значения компилятор
выведет тип переменной. Неинициализированные
переменные со спецификатором auto не допускаются:
auto number; // ошибка
auto при выводе типа в общем случае отбрасывает
квалификаторы и ссылки;
auto нельзя использовать в качестве параметра
функции.
77

77. Спецификатор auto

1)auto var = some_expression;
Если тип some_expression T* или const
T*, то тип var также будет T* или const T*
соответственно.
Однако, если тип some_expression —
T, const T, T& или const T&, то
типом var будет T.
78

78. Спецификатор auto

Спецификатор decltype
появился в обновлённом стандарте C++11.
Наряду с ключевым словом auto
используется для выведения типов выражений,
получаемых в качестве своего аргумента,
В отличие от auto сохраняет квалификаторы
типов const и &.
Также в стандарте С++11 ключевое слово
decltype можно использовать для
объявления типа возвращаемого функцией
значения в тех случаях, когда применяется
новый способ записи сигнатуры функции (в
котором возвращаемое значение следует за
списком её параметров).
79

79. Спецификатор decltype

Использование decltype(auto)
Это новая “фишка” С++14. Она нужна для
сохранения семантики decltype при
объявлении auto переменных и
используется в тех случаях, когда не
устраивает то, что auto отбрасывает
ссылки и квалификаторы
80

80. Использование decltype(auto)

Понятие переменной и константы
Переменная – это поименованная область
памяти, в которой хранятся данные
определённого типа.
Определяя переменную, необходимо
предоставить компилятору информацию о ее
типе. Тогда компилятор будет знать сколько
места нужно зарезервировать для нее и какого
рода значение будет в ней находиться.
Константа – фиксированная величина,
которая не изменяется в процессе выполнения
алгоритма или программы.
81

81. Понятие переменной и константы Переменная – это поименованная область памяти, в которой хранятся данные определённого типа.

Примером константы является
всем известное знаменитое число "ПИ",
значение которого в компьютере
принимается приближенно равным
3,1415926.
Создаваемые константы надо сразу
инициализировать.
82

82.

В C++ константы похожи на
переменные, за исключением того, что
они не могут быть изменены. Подобно
переменной, константа также занимает
пространство в памяти и имеет имя для
идентификации адреса выделенной для
нее области. Однако содержимое этой
области не может быть перезаписано.
83

83.

В языке C++ возможны следующие
константы:
• литеральные константы;
• константы, объявленные с
использованием ключевого слова const;
• константные выражения, использующие
ключевое слово constexpr (нововведение
С++11);
• константы перечислений,
использующие ключевое слово enum;
• константы, определенные с помощью
макроопределений, использование
которых не рекомендуется.
84

84.

Литеральные константы
(литералы)
Это значение, непосредственно
вводимое в программе. В следующем
примере числа 1 и 100 являются
литералами.
unsigned int counter1=1, a, b=100;
85

85.

Целые константы
Десятичная целая константа, если она не
нуль, записывается как последовательность
десятичных цифр. Старшая цифра десятичной
константы не должна быть нулем.
1864 и 3765 - десятичные целые константы
Восьмеричная целая константа
записывается со старшей цифрой равной нулю,
которая принимается за признак. Естественно, что
все последующие ее цифры не должны превышать
числа 7.
03567 и 01762 - целые восьмеричные
константы.
86

86. Целые константы Десятичная целая константа, если она не нуль, записывается как последовательность десятичных цифр. Старшая

Признаком шестнадцатеричной целой
константы является префиксы " 0x" или "
0X" перед последовательностью
шестнадцатеричных цифр (0, 1, 2, ..., 9, A,
B, C, D, E, F).
0xA6 – шестнадцатеричное
представление десятичного числа
10*16+6=160+6=166.
0XDF – шестнадцатеричное
представление десятичного числа
13*16+15=208+15=223.
87

87.

Вещественные константы
представляются в памяти компьютера как числа
с плавающей запятой. Например:
546.
3.1415926
.009865
или
.31415926E+03 - в экспоненциальной
форме.
(вначале пишется мантисса числа в стандартной
форме, вслед за нею записывается буква e или E,
которая обозначает выражение “умножить на
число 10 в степени”).
88

88.

.31415926E+01 = 0.31415626*10 =
3.1415926
7.897534E-03 = 7.897534*0.001 =
0.007897534
4.987535e+10 = 4.987535* 10000000000
= 49875350000
89

89.

Всем вещественным константам по
умолчанию компилятор будет присваивать тип
double, для которого в памяти компьютера будет
автоматически отводиться 8 байт (64 двоичных
разряда).
можно изменить размер, если указать после
числового значения константы один из
суффиксов:
F(f) - тип float (для вещественной константы)
или
L(l) - тип long (для целых и вещественных
констант) или
U(u) - тип unsigned (для целых констант).
90

90. Всем вещественным константам по умолчанию компилятор будет присваивать тип double, для которого в памяти компьютера будет

Так, например, чтобы вещественная
константа 6.85432 занимала 4 байта, а
не 8 байт, то нужно написать так:
6.85432F - константа типа float
(выделяется 4 байта).
© 2023 Конах В.В
91

91.

Символьные константы
Служат для изображения отдельных
символов из таблицы ASCII символов.
Каждая такая константа состоит из
изображения самого символа и
ограничивающих его с двух сторон
апострофов, например, 'A' или 'b'.
92

92.

Внутри апострофов записываются цифры,
буквы, знаки препинания и управляющие
символы, называемые управляющими
последовательностями (escapeпоследовательностями
-ESCsequence), которые не имеют графического
изображения на экране дисплея или на
принтере).
93

93.

Для кодирования таких символьных
констант используются комбинации из
нескольких символов, имеющих
графическое представление. Каждая
управляющая последовательность
начинается с символа обратной косой
черты ( "backslash" - обратный слэш ).
94

94.

backslash используется для представления:
кодов, которые не имеют графического
изображения на экране дисплея или на принтере,
например, ’\r’-возврат каретки;
символов апострофа, кавычки, знака вопроса,
обратной косой черты;
любого символа с помощью его
шестнадцатеричного или восьмеричного кода.
95

95.

'\a'
сигнал-звонок
'\b' возврат на одну позицию (на один символ)
'\f'
новая станица, перевод страницы
'\n' новая строка, перевод строки
'\r'
возврат каретки (курсора) к началу строки
'\t'
горизонтальная табуляция
'\v'
вертикальная табуляция
'\\'
обратная косая черта - обратный слэш
'\"' кавычка (символ двойной кавычки)
'\''
апостроф (одиночная кавычка)
'\0'
нулевой символ, нулевой байт
'\?'
знак вопроса
'\ddd’ восьмеричная константа,
где d - восьмеричная цифра
'\0xhh' шестнадцатеричная константа,
где h – шестнадцатеричная цифра
96

96. '\a' сигнал-звонок '\b' возврат на одну позицию (на один символ) '\f' новая станица, перевод страницы '\n' новая строка,

Так символ возврата каретки может быть
представлен различными способами:
\r - общая управляющая последовательность,
\015 - восьмеричная управляющая
последовательность,
\0x0D - шестнадцатеричная управляющая
последовательность.
© 2023 Конах В.В
97

97.

Строковая константа
– это последовательность символов,
заключенная в двойные кавычки
или R" (последовательность символов) ".
В языке Си нет стандартного типа "строка".
Поэтому строки представляются как массив
символов, заканчивающийся нулевым байтом.
Таким образом, строка занимает на один байт
памяти больше, чем количество символов в этой
строке, ибо в конец строки заносится
символьная константа - нулевой символ '\0'.
© 2023 Конах В.В
98

98.

В памяти компьютера все символы
строки размешаются подряд друг за
другом.
Формально
строковые
константы не относятся к константам
языка С++ в соответствии с его
стандартом.
99

99.

Символьные и строковые константы –
разные конструкции языка. Символьная
константа 'a' отличается от строковой
константы "a". Внешнее отличие состоит в
способе записи констант. Первая из них
записывается обрамленной в апострофы с двух
сторон, вторая - ограничивается с двух сторон
двойными кавычками. Кроме того, 'a' занимает
1 байт памяти, а "a" – два байта, т.е. на 1 байт
больше.
Пустая строка "" имеет длину 1, а пустая
символьная константа недопустима.
100

100.

Длинную строковую константу можно
разместить на нескольких строках. Для
этого достаточно поместить обратную
косую черту в самом конце строки:
"Эта строковая константа \
размещена на нескольких \
строках программы”
Или можно каждый фрагмент строки
взять в кавычки:
"Эта строковая константа "
"размещена на нескольких "
"строках программы"
101

101.

Примеры самоопределённых
констант (литералов)
Тип константы
Целая десятичная
Целая восьмеричная
Пример
8, 0, -5, 4U, 3000L
077, 0111
Целая
шестнадцатеричная
Вещественная
0xFFA2, 0X00FF
Символьная
Строковая
3.5, .001, 123.
0.2e6, .1E10, 23.7e-4, 5E+2
's',
'П',
'\n',
‘\?',
'\0xFF', '\077'
"Здесь был я",
"ЗАО\"МММ\"",
"C:\\autoexec.bat",
"\tSumma=\0xF5\n",
R"(This is ”string”)”
102

102. Примеры самоопределённых констант (литералов)

Определение констант с помощью
директивы #define
Для определения константы можно
воспользоваться директивой:
#define PI 3.14
По этой директиве везде в тексте
программы препроцессором вместо
константы будет подставлено ее значение.
Такая константа не имеет никакого
конкретного типа.
В стандарте С++ этот способ объявлен
устаревшим.
103

103.

Конец лекции
104
English     Русский Rules