Операции – это лексемы, обозначающие конкретные вычисления и применяемые к переменным и другим объектам в выражении. Язык С/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
РАЗРАБОТКА ПРОГРАММЫ ЛИНЕЙНОЙ СТРУКТУРЫ