Операции

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: