Операторы в C++

User Rating: 4 / 5

Оператор в C++ - это специальный символ (или символы), которые говорят компилятору выполнить определенную математическую, логическую или другую операцию. Язык C++ предоставляет следующие встроенные операторы:

  • операторы присваивания
  • арифметические операторы
  • операторы сравнения
  • логические операторы
  • побитовые операторы
  • вспомогательные операторы

Ниже по тексту статьи мы остановимся на каждом типе допустимых операторов и рассмотрим примеры их использования.

Операторы присваивания

Ниже представлена таблица с поддерживаемыми языком C++ операторами присваивания и их описанием:

 
Оператор Пример Описание
= A = B + C Простой оператор присваивания. Присваивает значения правых операндов (идущих после знака =) левому операнду.
+= A += B

Оператор сложения, совмещённый с присваиванием. Запись из примера эквивалентна A = A + B

Оператор прибавляет правый операнд к левому операнду и результат записывает в левый операнд.

-= A -= B

Оператор вычитания, совмещённый с присваиванием. Запись из примера эквивалентна A = A - B

Оператор вычитает правый операнд из левого операнда и результат записывает в левый операнд.

*= A *= B

Оператор умножения, совмещённый с присваиванием. Запись из примера эквивалентна A = A * B

Оператор умножает правый операнд на левый операнд и результат записывает в левый операнд.

/= A /= B

Оператор деления, совмещённый с присваиванием. Запись из примера эквивалентна A = A / B

Оператор делит левый операнд на правый операнд и результат записывает в левый операнд.

%= A %= B 

Оператор вычисления остатка от деления, совмещённый с присваиванием. Запись из примера эквивалентна A = A % B

Оператор вычисляет остаток от деления левого операнда на правый операнд и записывает его в левый операнд.

<<= A <<= B 

Оператор побитового сдвига влево, совмещённый с присваиванием. Запись из примера эквивалентна A = A << B

Оператор производит побитовый сдвиг влево для значения левого операнда на количество битов, заданных правым операндом и результат записывает в левый операнд

>>= A >>= B

Оператор побитового сдвига вправо, совмещённый с присваиванием. Запись из примера эквивалентна A = A >> B

Оператор производит побитовый сдвиг вправо для значения левого операнда на количество битов, заданных правым операндом и результат записывает в левый операнд

&= A &= B

Оператор побитового "И" (AND), совмещённый с присваиванием. Запись из примера эквивалентна A = A & B

Оператор вычисляет побитовое "И" между левым и правым операндом и результат записывает в левый операнд

|= A |= B 

Оператор побитового "ИЛИ" (OR), совмещённый с присваиванием. Запись из примера эквивалентна A = A |

Оператор вычисляет побитовое "ИЛИ" между левым и правым операндом и результат записывает в левый операнд

^= A ^= B

Оператор побитового исключающего "ИЛИ" (XOR), совмещённый с присваиванием.

Запись из примера эквивалентна A = A ^ B

Оператор вычисляет побитовое исключающее "ИЛИ" между левым и правым операндом и результат записывает в левый операнд

Арифметические операторы

В языке C++ поддерживаются следующие арифметические операторы:

 
Оператор Пример Описание
+ A + B

Оператор сложения. Складывает первый операнд со вторым.

Пример: Если операнд A равен 1, а операнд B равен 2, то A + B равно 3

- A - B

Оператор вычитания. Вычитает второй операнд из первого.

Пример: Если операнд A равен 5, а операнд B равен 3, то A - B равно 2

* A * B

Оператор умножения. Умножает первый операнд на второй.

Пример: Если операнд A равен 3, а операнд B равен 3, то A * B равно 9

/ A / B

Оператор деления. Делит первый операнд на второй.

Пример: Если операнд A равен 6, а операнд B равен 3, то A / B равно 2

% A % B

Оператор вычисления остатка от деления первого операнда на второй.

Пример: Если операнд A равен 4, а операнд B равен 2, то A % B равно 0

++ A++

Оператор инкремента. Увеличивает на единицу значение операнда.

Пример: Если операнд A равен 7, то A++ равно 8

-- A--

Оператор декремента. Уменьшает на единицу значение операнда.

Пример: Если операнд A равен 20, то A-- равно 19

Операторы сравнения

Язык C++ поддерживает операторы сравнения, представленные в таблице ниже:

 
Оператор Пример Описание
== A == B

Оператор равенства. Проверяет, что первый операнд равен второму, и, если это так, то возвращает true ("истина").

В противном случае возвращает false ("ложь")

Примеры:

1) Если операнд A равен 2 и операнд B равен 2, то A == B вернёт true

2) Если операнд A равен 5 и операнд B равен 4, то A == B вернёт false

!= A != B

Оператор неравенства. Выполняет действие, обратное оператору равенства. Проверяет, что первый операнд не равен второму, и, если это так, то возвращает true ("истина"). В противном случае возвращает false ("ложь").

Примеры:

1) Если операнд A равен 2 и операнд B равен 2, то A != B вернёт false

2) Если операнд A равен 5 и операнд B равен 4, то A != B вернёт true

> A > B

Оператор "больше". Проверяет, что первый операнд больше, чем второй. Если это так, возвращает true ("истина"), в противном случае возвращает false ("ложь").

Примеры:

1) Если операнд A равен 2 и операнд B равен 2, то A > B вернёт false

2) Если операнд A равен 5 и операнд B равен 4, то A > B вернёт true

< A < B

Оператор "меньше". Проверяет, что первый операнд меньше, чем второй. Если это так, возвращает true ("истина"), в противном случае возвращает false ("ложь").

Примеры:

1) Если операнд A равен 2 и операнд B равен 2, то A < B вернёт false

2) Если операнд A равен 10 и операнд B равен 20, то A < B вернёт true

>= A >= B

Оператор "больше или равно". Проверяет, что первый операнд больше или равен второму. Если это так, возвращает true ("истина"), в противном случае возвращает false ("ложь").

Примеры:

1) Если операнд A равен 2 и операнд B равен 2, то A >= B вернёт true

2) Если операнд A равен и операнд B равен 4, то A >= B вернёт true

3) Если операнд A равен и операнд B равен 22, то A >= B вернёт false

<= A <= B

Оператор "меньше или равно". Проверяет, что первый операнд меньше или равен второму. Если это так, возвращает true ("истина"), в противном случае возвращает false ("ложь").

Примеры:

1) Если операнд A равен 2 и операнд B равен 2, то A <= B вернёт true

2) Если операнд A равен и операнд B равен 40, то A <= B вернёт true

3) Если операнд A равен 100 и операнд B равен 10, то A <= B вернёт false

Логические операторы

В языке C++ поддерживаются следующие логические операторы:

 
Оператор Пример Описание
&& A && B

Оператор "логического И". Если оба операнда не равны 0, то результат будет равен true ("истина").

Если хотя бы один операнд равен 0, то результат будет равен false ("ложь")

Примеры:

1) Если A = 0, а B = 5, то A && B будет равно false, поскольку A равен нулю.

2) Если A = 100, а B = 0, то A && B будет равно false, поскольку B равен нулю.

3) Если A = 100, а B = 2, то A && B будет равно true, поскольку и A, и B не равны нулю.

|| A || B

Оператор "логического ИЛИ". Если хотя бы один операнд не равен 0, то результат будет равен true ("истина").

Если оба операнда равны 0, то результат будет равен false ("ложь")

Примеры:

1) Если A = 0, а B = 5, то A || B будет равно true, поскольку B не равен нулю.

2) Если A = 100, а B = 0, то A || B будет равно true, поскольку A не равен нулю.

3) Если A = 0 и B = 0, то A || B будет равно false, поскольку оба операнда равны нулю.

! !A

Оператор "логического отрицания". Предназначен для "переворачивания" текущего значения операнда.

Примеры:

1) Если операнд A равен 0, то !A будет не равно 0.

2) Если операнд A равен 1, то !A будет равно 0.

Побитовые операторы

Для рассмотрения и лучшего понимания работы побитовых операторов, которые будут представлены ниже в таблице, желательно сразу уяснить следующие моменты: в 1 байте помещается 8 бит. Значение каждого бита - это либо 0, либо 1, представленные в двоичной системе счисления. Максимальное число, которое может "поместиться" в 1 байте - это 255 (через несколько строк Вы поймете, почему это так).

Давайте теперь напишем несколько примеров того, какие значения может содержать 1 байт, если на них смотреть в нашей привычной десятичной системе счисления и что эти же числа представляют собой в двоичной системе счисления:

  • Если значение в байте 0, то в двоичной системе это представляется как восемь нулей, где все биты равны нулю: 0000 0000
  • Если значение в байте 1, то в двоичной системе представляется как 0000 0001
  • Если значение в байте 2, то в двоичной системе представляется как 0000 0010
  • Если значение в байте 3, то в двоичной системе представляется как 0000 0011
  • Если значение в байте 4, то в двоичной системе представляется как 0000 0100
  • Если значение в байте 5, то в двоичной системе представляется как 0000 0101
  • ... и так далее, до значения 254 ...
  • Если значение в байте 254, то в двоичной системе представляется как 1111 1110
  • Если значение в байте 255, то в двоичной системе представляется как "все восемь бит равны единице", т.е.: 1111 1111

Теперь посмотрим на таблицу, понимая, как выглядит представление чисел "внутри байта" в двоичной системе счисления, будет проще понять примеры.

 
Оператор Пример Описание
& A & B

Оператор побитового "И". Для каждого бита операнда A и каждого бита операнда B действует правило:

Если оба бита равны 1, то результирующий бит тоже равен 1, в противном случае результирующий бит равен 0

Пример: пусть A = 2, а B = 3.

Запишем оба числа в двоичном формате:

A = 0000 0010

B = 0000 0011

Результатом A & B в двоичном представлении будет число 0000 0010, поскольку только во 2-й позиции справа у нас обе единицы.

Таким образом, A & B равно 2.

| A | B 

Оператор побитового "ИЛИ". Для каждого бита операнда A и каждого бита операнда B действует правило:

Если хотя бы один бит равен 1 или оба бита равны 1, то результирующий бит тоже равен 1, в противном случае

результирующий бит равен 0

Пример: пусть A = 2, а B = 3.

Запишем оба числа в двоичном формате:

A = 0000 0010

B = 0000 0011

Результатом A | B в двоичном представлении будет число 0000 0011, поскольку во 2-й позиции справа у нас обе единицы в обоих операндах, а также есть единица в 1-й позиции слева у операнда B.

Таким образом, A | B равно 3.

^ A ^ B 

Оператор побитового исключающего "ИЛИ". Для каждого бита операнда A и для каждого бита операнда B действует правило: Если биты в заданной одинаковой позиции для операндов A и B отличаются, то результирующий бит будет равен 1, в противном случае результирующий бит будет равен 0

Пример: пусть A = 2, а B = 3

Запишем оба числа в двоичном формате:

A = 0000 0010

B = 0000 0011

Результатом A ^ B в двоичном представлении будет число 0000 0001. Оттого, что во 2-й позиции справа у нас обе единицы в обоих операндах (т.е. они совпадают), то результирующий бит во 2-й позиции будет равен 0. В 1-й же позиции справа бит операнда A равен 0, а для операнда B равен 1, они отличаются, поэтому результирующий бит будет равен 1. Во всех остальных позициях у обоих операндов 0 (т.е. значения битов совпадают), поэтому результирующие биты там будут равны 0.

Таким образом, A ^ B равно 1.

~ ~A 

Двоичный оператор дополнения до единицы (другое название оператора - оператор побитового дополнения) является унарным и имеет эффект "переворачивания" битов. Легко запомнить, как он работает - все биты во всех позициях для операнда просто инвертируются на противоположное им значение.

Пример: пусть A = 5

В двоичном формате значение A равно 0000 0101. Инвертируем биты во всех позициях и получим 1111 1010 

Если перевести это в десятичный формат, то результат соответствует числу 250. Поэтому в этом примере результат ~A равен 250

Почему же оператор называют оператором дополнения до единицы? Всё просто - если представить, что к каждому биту в каждой позиции прибавляется 1, то это как раз и вызовет эффект "переворачивания" бита. С нулём, думаю, тут всё понятно, а с единицей выходит следующее: когда к биту, который равен 1 (позиция бита не столь важна), будет прибавляться 1, то это равно 2 в десятичном формате, а в двоичном это соответствует число 10. И поскольку количество разрядов в результате увеличилось, то старший разряд (где и вышла единица) "отбрасывается", оставляя результатом 0, что и соответствует инвертированию единицы в ноль.

<< A << B 

Двоичный побитовый сдвиг влево. Работает оператор следующим образом: все биты левого операнда A сдвигаются влево на количество позиций, задаваемых правым операндом B. При сдвиге "освободившиеся" позиции заполняются нулём. 

Пример: пусть A = 3, B = 2, т.е. мы хотим сдвинуть все биты операнда A на две позиции влево.

Запись A в двоичном формате: 0000 0011. Сдвигаем все биты влево на 2 позиции, получим: 0000 1100, что соответствует числу 12 в десятичной системе счисления. Итог: 3 << 2 равно 12

>> A >> B  Двоичный побитовый сдвиг вправо. Работает оператор так же, как и побитовый сдвиг влево, только сдвигает биты в другую сторону: все биты левого операнда A сдвигаются вправо на количество позиций, задаваемых правым операндом B. При сдвиге "освободившиеся" позиции также заполняются нулём.

Пример: пусть A = 3B = 2, т.е. мы хотим сдвинуть все биты операнда A на две позиции вправо.

Запись A в двоичном формате: 0000 0011. Сдвигаем все биты вправо на 2 позиции, получим: 0000 0000, что соответствует числу 0 в десятичной системе счисления. Итог: 3 >> 2 равно 0

Вспомогательные операторы

К вспомогательным операторам в языке C++ относят:

  • оператор sizeof - вычисляет размер переменной в байтах. К примеру, если есть переменная x типа int, то sizeof(x) вернёт 4 (т.к. объем занимаемой памяти под int - это 4 байта).
  • условный оператор (его часто называют тернарный оператор) - x ? y : z. Он работает следующим образом: перед знаком вопроса помещается некоторое условие, для которого проверятся, равно ли оно true или false. Если оно равно true, то возвращается значение, идущее после знака вопроса, в противном случае возвращается результат, идущий после двоеточия. Например, следующий оператор: int a = b > 5 ? 10 : 20 запишет в переменную a значение 10, если текущее значение переменной b больше 5, иначе в a запишется 20.
  • оператор "запятая" ( , ) - заставляет несколько операций выполняться последовательно. Значение для всего выражения, разделенного запятыми - это значение последнего выражения в списке, разделенном запятыми
  • оператор "точка" ( . ) и "стрелка" ( -> ) - эти операторы используются для доступа к членам классов (class), структур (struct) и объединений (union).
  • операторы приведения типа - используются для приведения одного типа данных в другой. К примеру, оператор приведения типа int(5.44) вернёт значение 5
  • оператор получения ссылки & - используется для получения адреса памяти, где хранится переменная. Например, &x для переменной x вернёт значение адреса участка памяти, где хранится само значение x.

Приоритет операторов в C++

Как Вы понимаете, такое обилие операторов вызывает закономерный вопрос - с какой очередностью (или приоритетом) они будут срабатывать, если их скомбинировать в одном выражении на языке C++? Для того, чтобы результат операции в этом случае был предсказуем для программиста, нужно понимать и знать приоритет операторов в C++. В следующей таблице сверху-вниз указан приоритет различных операторов C++, в порядке от большего (самого высокого) приоритета к меньшему (самому низкому).

Очень просто это запомнить, взяв аналогию из математики: точно так же, как операции умножения и деления в математике имеют более высокий приоритет по сравнению с операциями сложения и вычитания, в C++ операторы умножения и деления имеют более высокий приоритет по отношению к операторам сложения и вычитания. 

Всегда операторы с более высоким приоритетом выполняются перед теми, что имеют меньший приоритет (при отсутствии группирующих круглых скобок, которые могут изменить приоритет).

 
Категория Оператор(ы) Ассоциативность
Постфиксные

() [] -> . ++ --

Слева-направо
Унарные

+ - ! ~ ++ -- (тип)* & sizeof

Справа-налево
Мультипликативные

* / %

Слева-направо
Аддитивные

+ -

Слева-направо
Сдвиг

<< >> 

Слева-направо
Сравнение

< <= > >=

Слева-направо
Эквивалентность

== !=

Слева-направо
Побитовое "И" (Bitwise AND) & Слева-направо
Побитовое исключающее "ИЛИ" (Bitwise XOR) ^ Слева-направо
Побитовое "ИЛИ" (Bitwise OR) | Слева-направо
Логическое "И" (Logical AND) && Слева-направо
Логическое "ИЛИ" (Logical OR) || Слева-направо
Условные (тернарный оператор) <условие> ? <значение1><значение2> Справа-налево
Присваивание

= += -= *= /= %= >>= <<= &= ^= |= 

Справа-налево
Запятая , Слева-направо

 

Яндекс.Метрика