Операции – это лексемы, обозначающие конкретные вычисления и применяемые к переменным и другим объектам в выражении. Язык С/C++ особенно богат операциями, включая не только общие арифметические и логические операции, но также операции манипуляции с двоичными кодами, компонентами структур и объединений и указателями (обращениями по адресу и ссылке).
В языке С++ операции могут быть перегружаемыми и неперегружаемыми. Перегрузка позволяет переопределять действия любой стандартной операции, когда используемые объекты представляют собой класс. Поэтому на данном этапе рассмотрим только неперегружаемые стандартные операции.
В языке С/C++ используются следующие стандартные операции:
| [ ] | () | . | – > | ++ | – – |
| & | * | + | – | ~ | ! |
| Sizeof | / | % | << | >> | < |
| > | <= | >= | == | != | ^ |
| | | && | || | ?: | = | *= |
| /= | %= | += | – = | <<= | >>= |
| &= | ^= | |= | , | # | ## |
| Операции # и ## используются только препpоцессоpом. |
Кроме перечисленных в языке С++ имеются следующие операции:
| :: | .* | – >* |
Некоторые операции могут иметь более чем одну интерпретацию в зависимости от контекста (таблица 2.2).
Таблица 2.2 – Операции, имеющие более чем одну интерпретацию
| Название операции | Пояснение |
| A * B | Умножение |
| *ptr | Обращение по адресу (ссылка) |
| A & B | Побитовая AND |
| &A | Операция взятия адреса |
| int & | Модификатор ссылки (С++) |
| label: | Метка |
| a? x: y | Условный оператор |
| void func(int n); | Прототип функции |
| a = (b+c)*d | Изменение приоритета выражения |
| a, b, c; | Выражение с запятыми |
| func(a, b, c); | Вызов функции |
| a = ~b; | Поразрядное отрицание |
| ~func() {delete a;} | Деструктор (С++) |
Операции могут быть унарными (с одним) и бинарными (с двумя операндами).
У нарные операции перечислены в таблице (2.3).
Таблица 2.3 – Унарные операции
| Название операции | Пояснение | Примеры |
| & | Адресная операция | int i=1,*p=&i;//инициализация указателя |
| * | Операция косвенной адресации | int j=2; *p=j; // то же, что и i=j |
| + | Унарный плюс | i=+1; j=+2 |
| – | Унарный минус | i= – 1; j= – 2 |
| ~ | Побитовое отрицание | Создает обратный код операнда |
| ! | Логическое отрицание | 0 если операнд не 0; 1 если операнд 0 |
| ++ | Префикс, постфикс (инкремент) | ++i; /* префикс */ j++; /* постфикс */ |
| – – | Префикс, постфикс (декремент) | – – i; j – –; /* декремент */ |
Операция sizeof (операнд ) определяет размер в байтах области памяти, занимаемой операндом. Операндом может быть переменная, массив, структура, перечисление и другие объекты.
К бинарным операциям относятся следующие операции (таблица 2.4):
· аддитивные;
· мультипликативные;
· сдвига;
· поразрядные;
· логические;
· присваивания;
· сравнения и равенства;
· доступа к компонентам;
· обращения к функции.
Аддитивные операции (бинарный плюс (сложение) и бинарный минус (вычитание) выполняются со встроенными типами данных (int, short, float, double и т.д.).
К мультипликативным операциям относятся умножение, деление, выделение остатка от деления. Операция / всегда означает деление. Однако если с обеих сторон от нее стоят целые величины (константы, переменные или их комбинации), она выполняет целочисленное деление. Если в результате такого деления получается остаток, С++ его отбрасывает. Операция% означает выделение остатка при целочисленном делении. Эта операция требует, чтобы с обеих сторон от ее знака стояли целые величины.
Таблица 2.4 – Унарные операции
| Тип операции | Название операции | Обозначение |
| Аддитивные | Бинарный плюс (сложение) | + |
| Бинарный минус (вычитание) | - | |
| Мультипликативные | Умножение | * |
| Деление | / | |
| Выделение остатка от деления | % | |
| Сдвига | Сдвиг кода влево | << |
| Сдвиг кода вправо | >> | |
| Поразрядные | Поразрядное AND | & |
| Поразрядное XOR – исключающее OR | ^ | |
| Поразрядное включающее OR | | | |
| Логические | Логическое AND | && |
| Логическое OR | || | |
| Присваивания | Присваивания | = |
| Умножение с присваиванием | *= | |
| Деление с присваиванием | /= | |
| Остаток от деления с присваиванием | %= | |
| Сложение с присваиванием | += | |
| Вычитание с присваиванием | – = | |
| Сдвиг влево с присваиванием | <<= | |
| Сдвиг вправо с присваиванием | >>= | |
| Поразрядное AND с присваиванием | &= | |
| Поразрядное XOR с присваиванием | ^= | |
| Поразрядное OR с присваиванием | |= | |
| Сравнения и равенства | Меньше чем | < |
| Больше чем | > | |
| Меньше чем или равно | <= | |
| Больше чем или равно | >= | |
| Равенства | Равно | = = |
| Не равно | ! = | |
| Доступа к компонентам | Прямой выбор компоненты | . |
| Косвенный выбор компоненты | – > | |
| Члена класса | Доступ к компоненту класса | :: |
| Прямое обращение через указатель к члену класса | .* | |
| Косвенное обращение через указатель к члену класса | – >* | |
| Условная операция | "Если а истинно, то х, иначе y | a? x: y |
| Обращения к функции | Например, y = sin(x) | |
| Операция запятая | , |
Операции сдвига – сдвиг кода влево, сдвиг кода вправо. При выходе бит из разрядной сетки биты теряются. В языке С++ эти операции могут быть перегружены и при подключении файла iostream.h они используются для ввода/вывода информации.
Поразрядные операции (поразрядное AND, поразрядное XOR – исключающее OR, поразрядное включающее OR) выполняются по следующему правилу:
| E1 | E2 | E1&E2 | E1^E2 | E1|E2 |
Например,
a = (a|b)^(a&b)
При a =3, b = 5 имеем: 011 | 101 –
первая скобка равна 111, 011 & 101 – вторая скобка равна 001.
Общий результат равен
a = 111^001 = 110, т.е. 6.
Логическими операциями являются логическое AND и логическое OR. Например, пусть на координатной плоскости x – y (рисунок 2.2) заданы две области (в первом и третьем квадрантах). Точки на осях x, y задаются двумя координатами – x,y (например, 0,4 т.е. x = 0, y = 4 и т.д.).
Выберем произвольно точку с координатами x и y и проверим, попала ли эта точка в заштрихованную область.
Если условие
x >= 0 && y >=4 && y <= 6 || y <= 0 && x >= – 6 && x <= – 4
выполняется, то точка с координатами x и y попала в заштрихованную область.
К операциям присваивания относятся следующие операции:
· присваивание;
· умножение с присваиванием;
· деление с присваиванием;
· остаток от деления с присваиванием;
· сложение с присваиванием;
· вычитание с присваиванием;
· сдвиг влево с присваиванием;
· сдвиг вправо с присваиванием;
· поразрядное AND с присваиванием;
· поразрядное XOR с присваиванием;
· поразрядное OR с присваиванием.
Составные операции присваивания интерпретируются следующим образом. Запись
Е1 операция = Е2;
имеет тот же смысл, что и запись
Е1 = Е1 операция Е2;
Например, запись
E1 += E2
интерпретируется как
E1 = E1 + E2.
В одной строке может стоять больше одной операции присваивания (=), например:
a=b=c=d=100;Знак = всегда означает: "переменной слева присвоить значение, стоящее справа". Операция выполняется справа налево. Поэтому первой значение 100 получает переменная d, затем с, b и а.
Знак присвоить может стоять даже внутри математического выражения:
x = 5+(r = 9-c);Здесь сначала переменной r будет присвоено значение 9-с, а затем переменная x получит значение 5+9-с;
К операциям сравнения и равенства относятся следующие операции:
· меньше чем;
· больше чем;
· меньше чем или равно;
· больше чем или равно.
Операциями равенства являются операции:
· равно;
· не равно.
Знак = никогда не используется как знак сравнения. В языке C++ нет логического типа. Поэтому, если выражение принимает ненулевое значение, то оно считается истинным, а если принимает нулевое значение – то оно считается ложным;
К операциям доступа к компонентам относятся следующие операции:
· прямой выбор компоненты;
· косвенный выбор компоненты.
К операциям члена класса относятся следующие операции:
· доступ к компоненту класса;
· прямое обращение через указатель к члену класса;
· косвенное обращение через указатель к члену класса.
Условной операцией является операция
a? x: y; "если а истинно, то х, иначе y"
Например:
ans = (а>b)? (a):(b);Операция «запятая» (,) не работает непосредственно с данными, а приводит к вычислению выражения слева направо. Эта операция дает возможность использовать в одной строке несколько выражений, разделенных запятой. Например:
int main(){int i = 10, j = 25; // Используется операция “запятая” return 0;} или i = 10;j = (i = 12, i+8); // Результат выполнения: j=20Сначала i получит значение 10, затем использование операции "запятая" приведет к тому, что i получит значение 12, а затем значение i+8, т.е. 12+8=20. Этот результат будет присвоен j;Операцией обращения к функции является, например:
y = sin(x)).
Приведем приоритеты операций (таблица 2.5), начиная с высшего (1) и кончая низшим (15) приоритетом:
Таблица 2.5 – Приоритеты операций
| Приоритет | Операция | Описание | Порядок выполнения |
| ++ | Префиксный инкремент | Слева направо | |
| -- | Префиксный декремент | ||
| () | Вызов функции, выделение выражения, преобразование типа | ||
| [ ] | Доступ к элементу массива | ||
| -> | Косвенный доступ к элементу структуры | ||
| . | Прямой доступ к элементу структуры | ||
| ! | Логическое отрицание | Справа налево | |
| ~ | Порязрядное логическое НЕ (обратный код) | ||
| - | Унарный минус | ||
| + | Унарный плюс | ||
| (type) | Преобразование к типу type | ||
| * | Выбор значения, содержащееся в памяти, на которое указывает указатель | ||
| & | Взять адрес объекта | ||
| sizeof () | Определение размера в байтах объекта, указанного в скобках | ||
| new, delete | Работа с динамической памятью | ||
| * | Умножение | Слева направо | |
| / | Деление | ||
| % | Выделение остатка от деления целых чисел | ||
| + | Сложение | Слева направо | |
| - | Вычитание | ||
| << | Поразрядный сдвиг кода влево | Слева направо | |
| >> | Поразрядный сдвиг кода вправо | ||
| < | Меньше | Слева направо | |
| <= | Меньше или равно | ||
| > | Больше | ||
| >= | Больше или равно | ||
| = = | Равно | Слева направо | |
| != | Не равно | ||
| & | Поразрядное логическое «И» | Слева направо | |
| ^ | Поразрядное исключающее «ИЛИ» (XOR) | Слева направо | |
| | | Поразрядное логическое «ИЛИ» | Слева направо | |
| && | Логическое «И» | Слева направо | |
| || | Логическое «ИЛИ» | Слева направо | |
| ?: | Условная операция | Слева направо | |
| = | Присваивание | Слева направо | |
| += | Сложение с присваиванием | ||
| -= | Вычитание с присваиванием | ||
| *= | Умножение с присваиванием | ||
| /= | Деление с присваиванием |
Окончание таблицы 2.5
| Приоритет | Операция | Описание | Порядок выполнения |
| %= | Определение остатка от деления с присваиванием | Слева направо | |
| <<= | Сдвиг влево с присваиванием | ||
| >>= | Сдвиг вправо с присваиванием | ||
| &= | Поразрядное логическое И с присваиванием | ||
| ^= | Поразрядное исключающее ИЛИ с присваиванием | ||
| |= | Поразрядное логическое ИЛИ с присваиванием | ||
| , | Операция «запятая» | Слева направо | |
| ++ | Постфиксный инкремент | ||
| -- | Постфиксный декремент |
Префиксный и постфиксные операции различаются приоритетом. Префиксные операции имеют самый большой приоритет и выполняются до любой другой операции. Постфиксные операции имею самый маленький приоритет и выполняются после всех остальных операций.
Задание на лабораторную работу 2
РАЗРАБОТКА ПРОГРАММЫ ЛИНЕЙНОЙ СТРУКТУРЫ






