Оператор в 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 | B Оператор вычисляет побитовое "ИЛИ" между левым и правым операндом и результат записывает в левый операнд |
^= | 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 равен 5 и операнд B равен 4, то A >= B вернёт true 3) Если операнд A равен 2 и операнд B равен 22, то A >= B вернёт false |
<= | A <= B |
Оператор "меньше или равно". Проверяет, что первый операнд меньше или равен второму. Если это так, возвращает true ("истина"), в противном случае возвращает false ("ложь"). Примеры: 1) Если операнд A равен 2 и операнд B равен 2, то A <= B вернёт true 2) Если операнд A равен 1 и операнд 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 = 3, B = 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> | Справа-налево |
Присваивание |
= += -= *= /= %= >>= <<= &= ^= |= |
Справа-налево |
Запятая | , | Слева-направо |