ОПЕРАЦИИ И ОПЕРАНДЫ
6.1 ОПЕРАЦИИ НАД ОПЕРАНДАМИ ПРОСТЫХ ТИПОВ
В этой лекции мы рассмотрим основные операции языка C++ над операндами простых типов, к которым относятся целые числа и арифметические выражения, которые используют целые числа, символы или числа с плавающей точкой.
Операция (operation) — действие, выполняемое над операндами. Каждая операция обозначается определенным знаком. Например, сложение обозначается знаком +, деление — знаком /, взятие адреса — знаком &.
Операнд (operand) — часть команды, определяющая аргумент, над которым выполняется операция. Операндами являются данные и результаты операции. В качестве операндов используются переменные, константы, вызовы функций.
Выражение (expression) — конструкция языка (формула) для вычисления значения в соответствии со значениями операндов. Значение выражения вычисляется путем выполнения операций над операндами в порядке, соответствующем приоритету операций.
В зависимости от количества операндов (один или два), различают унарные (unary operation) и бинарные (binary operation) операции. Например, изменение знака числа является унарной операцией, а умножение двух чисел — бинарной.
Приоритет операций (operation precedence) — очередность выполнения операций в выражении. Например, в арифметическом выражении сначала выполняются операции умножения и деления, затем—сложения и вычитания.
6.2 АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ
В табл. 6.1 приводятся все арифметические операции, их обозначение в программе, а также примеры с пояснениями.
Таблица 6.1. Арифметические операции
| Операция | Знак | Пример | Пояснения |
| Сложение | + | j =i+2; | Устанавливает j, равным i плюс 2 |
| Вычитание | - | j = i - 5; | Устанавливает j, равным i минус 5 |
| Умножение | * | у = х * 2; | Устанавливает у, равным х умноженное на 2 |
| Деление | / | z = х / 5; | Устанавливает z, равным х деленным на 5 |
| Деление по модулю | % | j = i % 3; | Устанавливает j, равным остатку от деления i на 3 |
| Инкремент | ++ | ++i; | Устанавливает i, равным i плюс 1 |
| i++; | |||
| Декремент | - - | - -i; | Устанавливает i, равным i минус 1 |
| i - -; |
6.3 ИНКРЕМЕНТ И ДЕКРЕМЕНТ
Инкремент увеличивает значение своего операнда на 1, а декремент его уменьшает на 1. Существует два способа записи этих операторов: префиксная (знак операции ставится перед операндом) и постфиксная (знак ставится после операнда).
При префиксной форме записи сначала над операндом производится действие, а затем он используется.
При постфиксной форме — сначала операнд используется, а затем выполняется действие.
В листинге 6.1 показаны примеры префиксной и постфиксной форм записи инкремента и декремента
Листинг 6.1.
int i = 2;
cout << ++i << ehdl; // выводится 3
cout <<i++<< endl; // выводится 3
cout << i << endl; // выводится 4
cout << i -- << endl; // выводится 4
cout << i << endl; // выводится 3
cout << --i <<endl; // выводится 2
6.4 АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ С ПРИСВАИВАНИЕМ
Значением выражения, стоящего с правой стороны от знака присваивания =, является значение левого операнда после присваивания.
В языке C++ существуют операторы, которые позволяют совмещать арифметические операции с операцией присваивания. Когда арифметическая операция выполняется вместе с присваиванием, происходит замещение уже существующего значения переменной новым значением.
В табл. 6.2 приводится перечень и обозначение арифметических операций! с замещением. Для каждой операции дается пример с пояснением.
Таблица 6.2. Арифметические операции с присваиванием
| Название | Знак | Пример | Пояснения |
| Присваивание | = | y = х; | Присваивание значения х переменной у |
| Сложение с замещением | += | y+= 2; | Увеличение переменной у на 2 |
| Вычитание с замещением | -= | j-= 5; | Уменьшение переменной j на 5 |
| Умножение с замещением | *= | y*= 7; | Увеличение переменной у в 7 раз |
| Деление с замещением | / = | z /= 5; | Уменьшение переменной z в 5 раз |
| Деление по модулю с замещением | % = | i %= 3; | Устанавливает i, равным остатку от деления i на 3 |
В табл. 6.3 включены примеры операций с замещением и их альтернативная запись обычным способом.
Таблица 6.3. Альтернативная запись арифметических операций с замещением
| Знак | Операция с замещением | Альтернативная запись |
| += | i += 2; | i = i + 2; |
| -= | j -= 5; | j=j-5; |
| *= | х *= х; | x = x * х; |
| /= | у /= 0.5; | у = у / 0.5; |
| %= | m %= 7; | m = m % 7; |
6.5 ОПЕРАЦИИ ОТНОШЕНИЯ
Операции отношения сравнивают между собой два значения. Сравнение устанавливает одно из трех возможных отношений между выражениями: равенство, больше или меньше.
Значением выражений, содержащих операции отношения или логические операции, является истина (true) или ложь (false).
В табл. 6.4 дается название операций, их обозначение в программе и приводятся пояснения о значении, которое может являться результатом операции отношения (листинг 6.2).
Таблица 6.4. Операции отношения
| Название | Знак | Пояснения |
| Равенство | == | Истина, если операнды равны, иначе — ложь |
| Неравенство | != | Истина, если операнды не равны, иначе — ложь |
| Меньше | < | Истина, если левый операнд меньше правого, иначе—ложь |
| Больше | > | Истина, если левый операнд больше правого, иначе —ложь |
| Меньше или равно | <= | Истина, если левый операнд меньше или равен правому, иначе—ложь |
| Больше или равно | >= | Истина, если левый операнд больше или равен правому, иначе — ложь |
Листинг 6.2.
int n = 5;
cout << (n==5)<< ehdl; // выводится 1
cout << (n!=5)<< endl; // выводится 0
cout << (n<5) << endl; // выводится 0
cout << (n>5) << endl; // выводится 0
cout << (n>=5)<< endl; // выводится 1
cout << (n<=5)<< endl; // выводится 1
cout << ((n+2)<=5)<< endl; // выводится 0
При выводе значения операции отношения на экран ложь представляется целым нулевым значением, истина — единицей.
6.6 ЛОГИЧЕСКИЕ ОПЕРАЦИИ
Логические операции позволяют производить действия только над выражениями, обладающими двумя значениями - истина или ложь.
К логическим операциям (табл. 6.5) относятся: отрицание, конъюнкция и дизъюнкция. Операция логического отрицания — унарная операция и требует одного операнда. Конъюнкция и дизъюнкция являются бинарными операциями, результат этих операций зависит от значений обоих операндов (листинг 6.3).
Таблица 6.5. Логические операции
| Название | Знак | Пояснения |
| Отрицание | ! | Значение операнда меняется на противоположное |
| Конъюнкция | && | Истина, если оба операнда истинны, иначе—ложь |
| Дизъюнкция | II | Истина, если хотя бы один из операндов истинен, иначе — ложь |
< Примечание >
Логические операции используются совместно с операциями отношений в условных операторах для организации разветвлений в программе. Значения операндов при вычислении результатов отношений или логических операций не изменяются.
int n = 5, j = 0; // объявление переменных с инициализацией
cout «! (n == 5) «endl; // выводится О
cout «(n >= 5 && n < 100) «endl; // выводится 1
cout «(n > 5 || n < 7) «endl; // Выводится 1
cout «!j «endl; // выводится 1
В первой строке объявляются две целочисленные переменные n и j, которые инициализируются при объявлении значениями 5 и 0 соответственно.
Во второй строке сначала вычисляется значение операции отношения n == 5, которое равно истине. Логическая операция отрицания истины дает ложь.
В третьей строке проверяется вхождение переменной n в диапазон от 5 до 99 при помощи отношений n >= 5 и n < 100. В результате вычисления значений этих отношений получатся два истинных ответа. Результатом конъюнкции этих отношений так же будет истина.
Далее проверяется дизъюнкция отношений n > 5 и n < 7. Первое отношение ложно, а второе истинно. Следовательно, их дизъюнкция тоже истинна.
В последней строке выводится результат отрицания нулевого значения переменной j. Результат очевиден.
ОПЕРАТОРЫ
Оператор (statement) представляет собой установленное синтаксисом языка базовое действие в программе. При выполнении оператора производится некоторое действие. В C++ любое выражение, которое заканчивается символом точки с запятой, является оператором.
7.1 ОПЕРАТОР-ВЫРАЖЕНИЕ
К операторам-выражениям относятся следующие: оператор присваивания, оператор вызова функции и пустой оператор.
Формат оператора присваивания имеет вид:
идентификатор = выражение;
Например,
z = х + у;
Формат оператора вызова функции:
имя_функции (аргумент 1,... аргументы);
Например,
func (х, 5);
Пустой оператор состоит только из символа точки с запятой. Этот оператор используется, как правило, для обозначения пустого тела в операторах цикла.
7.1 СОСТАВНОЙ ОПЕРАТОР
Составной оператор (блок) состоит из одного или большего числа операторов любого типа, заключенных в фигурные скобки. После закрывающейся фигурной скобки не должно быть точки с запятой. Если в блоке только один оператор, скобки не обязательны. Если в блоке два и больше операторов, наличие фигурных скобок является обязательным. Например,
{ z = func (x, у); z *= z;}
{ cout «j; cout «endl; ++j; }
< Примечание >
Все операторы C++ имеют свои строгие правила написания. Если правила будут нарушены, компилятор сообщит об ошибке.

7.2 УСЛОВНЫЙ ОПЕРАТОР IF
Формат оператора:
if (выражение)
оператор
Если выражение истинно, то выполняется оператор. Если выражение ложно, программа ничего не делает (листинг 7.1). Логическая схема оператора показана на рис. 7.1.
![]() |
ДА НЕТ
Рис. 7.1 Схема условного оператора if
Листинг 7.1. Пример использования оператора if
if (a == x) // если a равно x,
temp = a; // то temp получает значение a
if (! с) // если отрицание с истина,
{
temp = x; // то temp получает значение x
x = y; // x получает значение y
y = temp; // y получает значение temp
}
Схема использования оператора if из листинга 7.1 показана на рис.7.2
< Примечание >
В данном примере следует обратить внимание на запись условия а == х в операторе if. Если вместо двух знаков = записать только один, операция отношения равенства изменится на операцию присваивания, что повлечет за собой ошибку.
7.3 УСЛОВНЫЙ ОПЕРАТОР IF ELSE
Формат оператора;
If (выражение)
Оператор1
Else
Оператор2
Если выражение истинно, то выполняются оператор1, и управление передается на оператор, который следует за оператором2. Если выражение ложно, то выполняется оператор2, и управление передается на следующий за ним оператор (листинг7.2).
Логическая схема оператора показана на рис. 7.3.
![]() |
ДА НЕТ
Рис. 7.3 Схема условного оператора if else
Листинг 7.2. Пример использования оператора if else.
(Схема листинга показана на рис. 7.4)
if (a == x) // если a равно x,
temp = a; // то temp получает значение a
else // иначе (a не равно x)
temp = -a; // temp получает значение —a
if (k >= M && k <= N) // если k Î (N, M),
{
++k; // то k увеличивается на единицу,
x *= k; // x умножается на k
}
else x /= k; // иначе k Ï (N, M) x делится на k

7.4 ОПЕРАТОР ЦИКЛА WHILE
Формат оператора;
While (выражение)
Оператор_цикла
Сначала вычисляется выражение. Если это выражение истинно, то тогда выполняется оператор цикла и управление переходит обратно к началу цикла while. Оператор будет выполняться до тех пор; пока выражение не станет ложным.
Если выражение ложно, то управление передается следующему оператору
Логическая схема оператора показана на рис 7.5., пример показан на листинге 7.3
![]() |
Да Нет
Рис. 7.5 Логическая схема оператора цикла while
Листинг 7.3. Пример использования оператора while
static const int N = 10;
int x = 1, sum = 0;
while (x < N + 1) // пока x < 11
{
sum += x; // sum увеличивается на x
++x; // x увеличивается на единицу
}
cout << sum << endl; // выводится 55
![]() |
ДА НЕТ
Рис. 7.5 Схема листинга 7.3
В цикле накапливается сумма целых чисел. Цикл повторится 10 раз. Значение первого числа х = 1 задается до начала цикла. Переменная sum инициируется значением 0. При каждом проходе цикл while увеличивает значение sum на текущее значение х
sum += х;,
затем увеличивает переменную х на 1 оператором инкрементирования
++x;
После того как значение х станет равным 11, выражение
(х < N + 1)
станет ложным, и цикл закончится. Управление перейдет к оператору вывода вычисленного значения суммы.
< Примечание >
Следует помнить, что тело цикла, как правило, представляет собой составной оператор, а это значит, что оно будет заключено в фигурные скобки. Начинающие программисты часто забывают об этом. В результате в цикле остается только один оператор, что может привести к бесконечности цикла. Например, для данного примера, отсутствие фигурных скобок не даст циклу завершиться, так как увеличения х не произойдет.










