Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмизация и программирование на языке С++. Ч.1. Учебник
.pdf
3. Переменные итипы данных
41
Как уже говорилось ранее, изучать язык программирования последовательно практически невозможно. Здесь первый раз обратимся к понятиям глобального и локального
определения переменных, к которым вернемся еще раз при
рассмотрении функций в С++ (см. раздел 9).
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own
getch, system("pause") or input loop */
int i = -1;
int main() {
cout << "NO main " << i << endl << endl;
int i=0;
cout << «main “ << i << endl;
for(int i1=1; i1<3; i1++)
{
int i = 10;
cout << " for " << i << endl;
}
cout << "main, после for " << i << endl;
}
Результат приведен на рис. 3.9.
Рис. 3.9. Иллюстрация глобального и локального
определения переменных

42
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
Литералы используются в тексте программы для обозначения числовых значений, строк символов или логических
констант. Другими словами, литерал представляет собой постоянное значение, у которого нет имени.
Целочисленные литералы записываются в привычном
виде: последовательность цифр со знаком + или – (знак +
можно опустить). Например, 25, –7, +553.
Литералы с плавающей точкой могут быть записаны в
виде целой и дробной частей, разделенных точкой (целая часть
может отсутствовать, если она равна 0; если дробная часть равна 0, то после точки должен быть записан 0) или в экспоненциальной форме. В последнем случае число состоит из мантиссы
(вещественной константы в десятичном представлении) и порядка – целого числа, перед которым располагается буква e
или Е. Например, 2.3Е–2 обозначает число 2.310
Здесь 2.3 – мантисса, –2 – порядок. Например, 8.1, .23, 3.0,
–5.3, 1E–1, 5e4.
Символьные литералы используются для представления
одиночных символов (заключаются в одинарные кавычки).
Литералы для представления логических значений:
false
.
Примеры литералов приведены в табл. 3.3.
–2
(или 0,023).
true
,
Таблица 3.3
Литералы базовых типов С++
Символьный
символьный двухбайтовый
Целочисленный
с плавающей точкой
с плавающей точкой двойной точности
логический (булевый)
char '0'; u8'a'
u'b'; U'C'
wchar_t L'z'
int 3; +3; –33
oat 4.4, 4.4f
bouble 5.5l
bool true; false
Приведем фрагмент кода, в котором иллюстрируется использование вещественных литералов (с плавающей точкой).

3. Переменные итипы данных
43
auto a=1.2f;
cout << "type a : " << typeid(a).name() << endl;
// oat
auto b=1.2F;
cout << "type b : " << typeid(b).name() << endl;
// double
auto c=1.2l;
cout << "type c : " << typeid(c).name() << endl;
Результат приведен на рис. 3.10.
Рис. 3.10. Вывод литералов вещественного типа
Еще приведем фрагмент программы, иллюстрирующий
двоичные, восьмеричные и шестнадцатеричные литералы.
auto b1 = 0b1111; // Двоичный литерал
auto o2 = 0111; // Восьмеричный литерал
auto x3 = 0x11; // Шестнадцатеричный литерал
cout << " b1 binary " << typeid(b1).name() << " " << oct << b1;
cout << " "<< dec << (int)b1 << endl;
cout << " o2 oct " << typeid(o2).name() << " " << oct << o2;
cout << " "<< dec << (int)o2 << endl;
cout << " x3 hex " << typeid(x3).name() << " " << hex << x3;
cout << " "<< dec << (int)x3 << endl;
Результат приведен на рис. 3.11.
Более полное описание всех типов литералов можно найти
в [26, 27, 28].
\
В заключение отметим, что с помощью символа
(обрат-
ный слеш) можно указать некоторые специальные и управ-
\
ляющие символы. Последовательность
и следующего за ним

44
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
символа называется управляющей последовательностью, или
escape-последовательностью. Например, наличие в строке по-
\t
следовательности \n означает переход на новую строку,
–
горизонтальную табуляцию и т.п.
Рис. 3.11. Вывод литералов двоичного, восьмеричного
и шестнадцатеричного типов
Существует три вида escape-последовательностей: простая,
восьмеричная и шестнадцатеричная. [29]. Примеры приведены в табл. 3.4.
Таблица 3.4
Примеры escape-последовательностей
Значение Escape-последовательность
?
или
\n
\\
\t
\?
\v
\’
\b
\»
\r
\0
\f
\ooo
\a
\xhh
Новая строка
Обратная косая черта
Горизонтальная табуляция
Вопросительный знак
Вертикальная табуляция
Одинарная кавычка
BACKSPACE
Двойная кавычка
Возврат каретки
Нуль-символ
Смена страницы
Восьмеричный
Оповещение (колокольчик)
Шестнадцатеричный
Символ обратный слеш (\), когда он размещен в конце
строки, является указанием о продолжении строки. Приве-

3. Переменные итипы данных
45
дем фрагмент программы, иллюстрирующий его использование.
#include <iostream>
using namespace std;
int main()
{
cout<<"Hello \
World";
return 0;
}
Результат выполнения в онлайн-компиляторе OnlineGDB
приведен на рис. 3.12.
Рис. 3.12. Использование обратной косой черты для переноса
строки в тексте программы
И, наконец, приведем пример использования управляю-
\n
щих последовательностей (
и \b). Первая из них уже встречалась, она приводит к переводу в новую строку. А вторая приводит к возврату на один символ назад. В тексте предыдущей
Hello
и
World
программы между словами
расположено 5 пробелов, четыре из которых находятся вначале второй строки. Если
перед вторым словом пометить escape-последовательность
\b
то эти четыре пробела не напечатаются.
cout<<«Hello \
\b\b\b\bW\no\nr\nl\nd»;
Результат выполнения программы приведен на рис. 3.13.
,

46
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
Рис. 3.13. Еще один вариант программы «Hello, world!»

Выражения (в данном случае речь идет только о числовых выражениях) аналогичны привычным алгебраическим
выражениям. Выражение может содержать символы арифметических операций: сложения +, вычитания –, умножения *, деления / и вычисления остатка при целочисленном
делении % (как уже говорилось выше, операция возведения
в степень в языке C++ отсутствует) и операнды, над которыми эти операции выполняются. Операндами могут быть литералы, переменные и обращения к методам (функциям), результатом которых является одно значение.
i++
Также будем считать, что
++
волы
инкремент») (а добавление к нему точки с запятой уже делает эту синтаксическую конструкцию инструкцией).
типов. Тип результата каждой операции зависит от типа операндов, участвующих в операции. Тип результата последней
операции определяет тип результата вычисления выражения.
операндами осуществляется в соответствии со следующими
правилами:
тот же тип (
целое получается целое число. Остаток от деления теряется;
результат будет вещественный (
необходимости автоматически преобразуется к типу
лении) требует только целых операндов.
содержащего операнды одинакового типа (в данном случае
это литералы типа int), будет иметь тот же тип.
определяют операцию, называемую «префиксный
Всего в списке операций С++ более 50.
В выражениях могут присутствовать операнды разных
Определение типа результата операции над числовыми
• если оба операнда целые (типа
int
). В соответствии с этим при делении целого на
• если один из операндов вещественный (тип
Оператор % (вычисление остатка при целочисленном де-
Например, результат вычисления значения выражения,
является выражением (сим-
int
), результат будет иметь
double
), то
double
). Второй операнд при
double
.

48
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
1+2*3
А результаты вычисления значений этих выражений, содержащих операнды разных типов
1+2/3
1.0+2/3
получат, соответственно, целый и вещественный тип, при этом
оба значения будут равны 1, так как деление двух целых чисел
приведут к значению целого типа. А вот если записать так
1+2.0/3
то результат будет вещественным и равным 1,67777.
Приведем пример, где операнды разных типов (
oat
и
Переменной типа
) соединяются знаками арифметических операций.
char
присвоено значение
char, int
'1'
. Код этого
символа 49. Второй переменной присвоено значение 2, а третьей – 3.0. Здесь используется операция сложения, порядок
операций сначала прямой, а затем обратный.
char c1='1';
int i2=2;
oat f3 = 2.0;
cout << "\n" << "+ " << endl;
cout << " char+char " << (c1+c1) << " " << (char) (c1+c1) <<endl;
cout << " char+int " << (c1+i2) << endl;
cout << " char+oat " << (c1+f3) << endl;
cout << " char+int+oat " << (c1+i2+f3) << endl;
cout << " (int)char " << ((int(c1))) << endl;
cout << "\n" << "2+ " << endl;
cout << " int+char " << (i2+c1) << endl;
cout << " oat+char " << (f3+c1) << endl;
cout << " oat+int+char " << (f3+i2+c1) << endl;
cout << " (int)char " << ((int(c1))) << endl;
Результат представлен на рис. 4.1.
char
Переменная типа
и выражение
ет символу
'1'+'1'
b
. Числовые переменные интерпретируются как 2
получит значение
сохраняет только один символ
2*49
. Это соответству-

4. Операции (выражения)
49
и 3. И их значения добавляются к коду 49. Обратный порядок в операции сложения не меняет результата. При использовании операций умножения и деления ситуация такая же.
Рис. 4.1. Операция сложения с разными типами данных
cout << "\n" << "* " << endl;
cout << " char*int " << (c1*i2) << endl;
cout << " char*oat " << (c1*f3) << endl;
cout << " char*int*oat " << (c1*i2*f3) << endl;
cout << "\n" << "/ " << endl;
cout << " char/int " << (c1/i2) << endl;
cout << " char/oat " << (c1/f3) << endl;
cout << " char/int/oat " << (c1/i2/f3) << endl;
Результат представлен на рис. 4.2.
Если в выражении несколько операторов, то они выполняют действия в соответствии со следующими приоритетами:
*
операторы умножения и деления
+, –
и вычитания
. Операции одного приоритета выполняются
, /, %, операторы сложения
по порядку слева направо. Дополнительный приоритет устанавливается при помощи скобок (как и в алгебраических
выражениях). В частном случае выражение может состоять
из одной константы или переменной. Если операндом какойлибо операции является обращение к функции, то сначала

50
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
выполняется это обращение, чтобы получить в качестве операнда числовое значение.
Рис. 4.2. Операции умножения и деления с разными типами
данных
Например, при вычислении выражения
1+2*3
сначала выполняется умножение, а уже затем сложение. Результат будет равен 7. Если нужно сначала выполнить сложение, а затем умножение, то необходим использовать скобки –
Тогда результат будет 9. Так же и в выражении
1+2.0/3
(1+2)*3
.
сначала выполняется деление (имеющее больший приоритет).
При этом результат этой операции будет уже вещественным.
Таблица 4.1 содержит список приоритетов для версии
С++20 [30].
Таблица 4.1
Приоритеты операций С++
::
1
( ) [ ] . -> x++ x –
2
! ~ ++x --x *x &x (type) sizeof co_await new new[ ] delete delete[ ]
3
* ->*
4
* / %
5
+ –
6
<< >> co_yield
7
<=>
8
< <= > >=
9
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
