Какого типа операторы используются в C++? В чем особенность каждого из типов?

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

  • Арифметические операторы
  • Реляционные операторы
  • Логические операторы
  • Побитовые операторы
  • Операторы присваивания
  • Другие операторы

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

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

Оператор Описание Пример
+ Добавляет два операнда A + B даст 30
Вычитает второй операнд с первого A — B даст -10
* Умножает оба операнда A * B даст 200
/ Делит числитель на де-числитель B / A даст 2
% Оператор модуля и остаток после целочисленного деления B% A даст 0
++ Оператор приращения увеличивает целочисленное значение на единицу A ++ даст 11
Уменьшает целочисленное значение на единицу A— даст 9

Реляционные операторы

Существуют следующие реляционные операторы, поддерживаемые языком C ++:

Оператор Описание Пример
== Проверяет, равны ли значения двух операндов или нет, если да, то условие становится истинным. (A == B) не соответствует действительности.
знак равно Проверяет, равны ли значения двух операндов или нет, если значения не равны, условие становится истинным. (A! = B) истинно.
> Проверяет, превышает ли значение левого операнда значение правого операнда, если да, тогда условие становится истинным. (A> B) неверно.
< Проверяет, является ли значение левого операнда меньше значения правильного операнда, если да, тогда условие становится истинным. (A <B) истинно.
> = Проверяет, превышает ли значение левого операнда значение правого операнда, если да, тогда условие становится истинным. (A> = B) неверно.
<= Проверяет, является ли значение левого операнда меньше или равно значению правильного операнда, если да, тогда условие становится истинным. (A <= B) истинно.

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

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

Оператор Описание Пример
&& Вызывается логическим оператором AND. Если оба операнда отличны от нуля, условие становится истинным. (A && B) является ложным.
|| Вызывается логическим оператором ИЛИ. Если любой из двух операндов отличен от нуля, тогда условие становится истинным. (A || B) истинно.
! Вызывается логическим оператором NOT. Используется для изменения логического состояния операнда. Если условие истинно, то логический оператор NOT сделает ложным. ! (A && B) истинно.

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

Побитовый оператор работает с битами и выполняет побитовую операцию. Таблицы истинности для &, |, и ^ заключаются в следующем:

p q p & q p | q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

Побитовые операторы, поддерживаемые языком C ++, перечислены в следующей таблице:

Оператор Описание Пример
& Двоичный оператор AND копирует бит в результат, если он существует в обоих операндах. (A & B) даст 12, что составляет 0000 1100
| Двоичный оператор OR копирует бит, если он существует в любом из операндов. (A | B) даст 61, который равен 0011 1101
^ Оператор двоичного XOR копирует бит, если он установлен в один операнд, но не тот и другой. (A ^ B) даст 49, который равен 0011 0001
~ Binary Ones Оператор дополнения является унарным и имеет эффект «flipping» бит. (~ A) даст -61, что составляет 1100 0011 в форме дополнения 2 из-за подписанного двоичного числа.
<< Двойной левый оператор сдвига.Значение левых операндов перемещается влево на количество бит, заданных правым операндом. A << 2 даст 240, что составляет 1111 0000
>> Двоичный оператор правого сдвига. Значение левых операндов перемещается вправо на количество бит, заданных правым операндом. A >> 2 даст 15, что составляет 0000 1111

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

Существуют следующие операторы присваивания, поддерживаемые языком C ++:

Оператор Описание Пример
знак равно Простой оператор присваивания, присваивает значения из правых операндов в левый операнд. C = A + B присваивает значение A + B в C
+ = Оператор Add AND присваивания, Он добавляет правый операнд в левый операнд и присваивает результат левому операнду. C + = A эквивалентно C = C + A
знак равно Subtract AND assign operator, вычитает правый операнд из левого операнда и присваивает результат левому операнду. C — = A эквивалентно C = C — A
знак равно Оператор умножения и присваивания, Он умножает правый операнд на левый операнд и присваивает результат левому операнду. C * = A эквивалентно C = C * A
знак равно Оператор Divide AND assign. Он делит левый операнд на правый операнд и присваивает результат левому операнду. C / = A эквивалентно C = C / A
знак равно Модуль и оператор присваивания, он принимает модуль с использованием двух операндов и присваивает результат левому операнду. C% = A эквивалентно C = C% A
<< = Оператор сдвига слева и. C << = 2 совпадает с C = C << 2
>> = Оператор правой смещения и назначения. C >> = 2 совпадает с C = C >> 2
знак равно Побитовый И оператор присваивания. C & = 2 является таким же, как C = C & 2
^ = Побитовое исключающее ИЛИ и оператор присваивания. C ^ = 2 является таким же, как C = C ^ 2
| = Побитовое включение оператора OR и присваивания. C | = 2 совпадает с C = C |2

Другие операторы

В следующей таблице перечислены некоторые другие операторы, поддерживаемые C ++:

Оператор Описание
sizeof Возвращает размер переменной. Например, sizeof (a), где ‘a’ является целым числом и будет возвращать 4.
Condition ? X : Y Если Условие истинно, то оно возвращает значение X, иначе возвращает значение Y.
, Вызывает последовательность операций. Значение всего выражения запятой — это значение последнего выражения списка, разделенного запятыми.
. (dot) and -> (arrow) Используются для ссылки на отдельных членов классов, структур и союзов.
Cast Преобразуют один тип данных в другой. Например, int (2.2000) вернет 2.
& Возвращает адрес переменной. Например, & a; даст фактический адрес переменной.
* Является указателем на переменную. Например * var; будет указывать на переменную var.

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

Приоритет оператора определяет группировку терминов в выражении. Это влияет на оценку выражения. Некоторые операторы имеют более высокий приоритет, чем другие; например, оператор умножения имеет более высокий приоритет, чем оператор сложения —

Например, x = 7 + 3 * 2; здесь x назначается 13, а не 20, потому что оператор * имеет более высокий приоритет, чем +, поэтому он сначала умножается на 3 * 2, а затем добавляется в 7.

Здесь операторы с наивысшим приоритетом появляются в верхней части таблицы, а нижние — внизу. Внутри выражения сначала будут оцениваться операторы с более высоким приоритетом.

Категория Оператор Ассоциативность
постфикс () [] ->. ++ — — Слева направо
Одинарный + -! ~ ++ — — (тип) * & sizeof Справа налево
Multiplicative * /% Слева направо
присадка + — Слева направо
сдвиг << >> Слева направо
реляционный <<=>> = Слева направо
равенство ==! = Слева направо
Побитовое AND & Слева направо
Побитовое XOR ^ Слева направо
Побитовое OR | Слева направо
Логические AND && Слева направо
Логический OR || Слева направо
условный ?: Справа налево
присваивание = + = — = * = / =% = >> = << = & = ^ = | = Справа налево
запятая , Слева направо

***

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

Выражения в С++ содержат, помимо переменных, еще и операторы. Операторы условно можно поделить на арифметические, логические, поразрядные и операторы отношения.

Арифметические операторы используются для сложения, вычитания, умножения и деления чисел.

Оператор Назначение
+ Сложение
Вычитание
* Умножение
/ Деление. Если операндами являются целые числа, выполняется
целочисленное деление
% Остаток от деления (деление по модулю)
++ Инкремент
Декремент

Первые пять операторов являются бинарными, то есть используются с двумя операндами. За исключением операторов деления по модулю (остаток от целочисленного деления), инкремента и декремента, операторы совпадают с соответствующими математическими операторами. Если оператор деления по модулю особых комментариев не требует, то операторы инкремента и декремента в определенном смысле являются визитной карточкой языка С++. Оператор инкремента даже присутствует в названии языка.

Операторы инкремента и декремента являются унарными (используются с одним операндом). Действие операторов состоит в увеличении или уменьшении значения операнда на единицу. Например, результат выполнения команды i++ есть увеличение значения переменной i на единицу. Другими словами, команды i++ и i=i+1 с точки зрения влияния на значение переменной i являются эквивалентными. Аналогично в результате команды i— значение переменной i уменьшается на единицу, как и в результате выполнения команды i=i-1.

Операторы инкремента и декремента могут использоваться в префиксной и постфиксной формах. В префиксной форме оператор указывается перед операндом, а в постфиксной форме – после него. Выше операторы инкремента и декремента использовались в постфиксной форме. В префиксной форме соответствующие операции выглядели бы как ++i и —i.

В плане действия на операнд разницы в префиксной и постфиксной формах нет. В результате выполнения команды ++i значение переменной i увеличивается на единицу, как и для команды i++. Уменьшение значения переменной i на единицу осуществляется при использовании команды —i. В этом отношении она не отличается от команды i—. Разница между постфиксной и префиксной формами операторов инкремента и декремента проявляется в ситуации, когда эти операторы использованы в выражениях.

Естественным образом возникает вопрос относительно переменной-операнда, по отношению к которой применяется операция инкремента или декремента и которая является составной частью более сложного выражения: следует ли сначала вычислить выражение и затем изменить значение переменной или сначала следует изменить значение переменной, а уже потом вычислять выражение?

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

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

В C++ существует достаточно удобный формат использования арифметических операторов – так называемая сокращенная форма арифметических операторов. В соответствии с сокращенной формой операторов команды вида операнд1=операнд1 оператор операнд2 можно записывать в виде операнд1 оператор=операнд2. В данном случае операнд1 и операнд2 – операнды выражения, а оператор – один из бинарных арифметических операторов. Например, команда x+=3 эквивалентна команде x=x+3, а команду a=a*b можно записать как a*=b. Сокращенная форма арифметических операторов позволяет существенно упростить код и очень часто используется на практике.

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

Логические операторы предназначены для работы с операндами логического типа и результатом соответствующих операций являются значения логического типа. В C++ всего три логических оператора, представленных в таблице 1.4.

Оператор Назначение
&& Логическое И. Бинарный оператор. Результатом выражения A&&B является true, если оба операнда A и B равны true. Результатом выражения A&&B является false, если хотя бы один из операндов A или B равен false
|| Логическое ИЛИ. Бинарный оператор. Результатом выражения
A||B является true, если хотя бы один из операндов A или B ра-
вен true. Результатом выражения A||B является false, если оба
операнда A и B равны false
! Логическое отрицание. Унарный оператор. Результатом выражения !A является значение true, если операнд A равен false. Если операнд A равен true, значение выражения !A равно false

Обращаем внимание читателя на два важных обстоятельства. Во-первых, в языке C++ вместо логических значений можно использовать числовые. При этом имеет место преобразование типов, о котором будет рассказано несколько позже. В соответствии с этим правилом ненулевые значения интерпретируются как true, а нулевые значения как false. Это исключительно удобный и полезный механизм, который часто используется на практике, особенно в условных операторах.

Во-вторых, в C++ нет логического оператора «исключающее или». Обычно эту операцию обозначают как XOR. При этом результатом выражения A XOR B является значение true, если один и только один из операндов A и B равен true, и false в противоположном случае. Однако это обстоятельство не является особенно проблематичным, поскольку с помощью имеющихся в C++ логических операторов можно легко записать эквивалент выражения A XOR B. Действительно, легко убедиться, что результатом выражения (A||B)&&!(A&&B) является true, только если операнды A и B различны (один равен true, а другой равен false).

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

Операторы сравнения используются для сравнения значений операндов. Результатом выражения на основе оператора сравнения является логическое значение: true, если соответствующее условие выполнено, и false в противоположном случае. Операторы сравнения перечислены в таблице 1.5.

Оператор Назначение
> Больше
< Меньше
>= Больше или равно
<= Меньше или равно
== Равно
!= Не равно

Все перечисленные операторы являются бинарными.

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

Язык программирования C++ обладает полным набором побитовых операторов. Побитовые операторы применяются при выполнении операций с битами в двоичном представлении числовых значений.

Рассмотрим основные побитовые операции и операторы, которые используются для этого в языке программирования C++. Список побитовых операторов приведен в таблице 1.6.

Оператор Назначение
& Побитовое И. Бинарный оператор. Результатом выражения a&b является число, каждый бит которого в двоичном представлении равен результату сравнения соответствующих битов чисел a и b: значение бита равно 1, если оба сравниваемых бита равны 1. В противном случае значение бита равно 0
| Побитовое ИЛИ. Бинарный оператор. Результатом выражения a|b является число, каждый бит которого в двоичном представлении равен результату сравнения соответствующих битов чисел a и b: значение бита равно 1, если хотя бы один из сравниваемых битов равен 1. В противном случае значение бита равно 0
^ Побитовое исключающее ИЛИ. Бинарный оператор. Результатом выражения a^b является число, каждый бит которого в двоичном представлении равен результату сравнения соответствующих битов чисел a и b: значение бита равно 1, если один и только один из сравниваеых битов равен 1. В противном случае значение бита равно 0
~ Побитовое отрицание (дополнение до единицы). Унарный оператор. Результатом выражения ~a является число, которое получается побитовым инвертированием числа a
>> Сдвиг вправо. Бинарный оператор. В двоичном представлении числа, указанном слева от оператора, выполняется сдвиг всех битов вправо на число позиций, указанных справа от оператора. При этом старший бит знака остается неизменным, а выходящие за диапазон младшие биты теряются
<< Сдвиг влево. Бинарный оператор. В двоичном представлении числа, указанном слева от оператора, выполняется сдвиг всех битов влево на число позиций, указанных справа от оператора, с заполнением младших битов нулями и потерей старших битов

Приведем некоторые примеры использования побитовых операторов. Они представлены в таблице 1.7. Даже в самых простых случаях результат может оказаться несколько неожиданным.

Выражение Значение Пояснение
5&3 1 В двоичном представлении число 5 имеет вид 101, а число 3 представляется как 011. Побитовое сравнение чисел 101 и 011 с помощью оператора побитового И & дает 001, что в десятичной системе соответствует числу 1
5|3 7 Применение оператора побитового ИЛИ | для сравнения чисел 101 и 011 дает 111, что в десятичной системе соответствует числу 7
5^3 6 Применение оператора побитового исключающего ИЛИ ^ для сравнения чисел 101 и 011 дает 110, что в десятичной системе соответствует числу 6
~5 -6 После применения операции побитового инвертирования ~ к числу 5 требует особых пояснений. На самом деле в 8-битовом представлении число 5 имеет вид 00000101. В предыдущих случаях нулевые старшие разряды роли не играли, поэтому они явно не указывались. При инвертировании наличие старших нулевых битов важно. Инвертирование дает 11111010. Это не что иное, как представление в двоичном машинном коде числа -6. Последнее читатель может проверить самостоятельно
5>>2 1 После сдвига вправо на две позиции для числа 5 (двоичный код 101) получаем 001. В десятичной системе это число 1
5<<2 20 После сдвига влево на две позиции для числа 5 (двоичный код 101) получаем 10100. В десятичной системе это число 20

Обращаем внимание читателя на особенности применения операции побитового сдвига к отрицательным числам. Например, результатом выражения -6>>5 является число -1. Дело в том, что в бинарном коде 11111010 для числа -6 при сдвиге вправо на 5 позиций при условии сохранения значения старшего бита знака получаем код 11111111. Это код числа -1.

Особенности операций в двоичной системе таковы, что сдвиг в побитовом представлении числа на одну позицию влево означает умножение этого числа на 2. Следует только помнить, что с определенного момента при сдвиге вправо теряются старшие биты. Представим, что число задается 8 битами. Если воспользоваться командой 1<<6, получим в качестве результата значение 26 = 64 . Действительно, десятичное число 1 в двоичной системе в 8-битовом представлении задается как 00000001. После сдвига влево на 6 позиций получаем 01000000, что в десятичной системе соответствует числу 64. Однако если воспользоваться командой 1<<7, получим в качестве результата -128. Объясняется это следующим обстоятельством. После сдвига влево на 7 позиций из числа 00000001 получаем число 1000000. Это отрицательное число, о чем свидетельствует старший единичный бит. Переводя это число в десятичную систему, сначала инвертируем бинарный код и получаем 01111111. Это код числа 127. Чтобы получить конечное значение, необходимо прибавить к этому результату 1 и добавить минус – в результате приходим к значению -128.

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

Главная особенность оператора присваивания в C++ состоит в том, что он возвращает значение. Это означа-ет, что выражение с оператором присваивания может, в свою очередь, быть частью другого выражения. Синтаксис использования оператора присваивания таков: переменная=выражение. При этом переменной в качестве значения присваивается результат, возвращаемый при вычислении выражения. Результат выражения является тем значением, которое возвращает оператор присваивания. Поэтому помимо обычных присваиваний вида n=5 допускается многократное использование оператора присваивания в выражениях.

Например, вполне законной является инструкция вида x=y=z=3, в результате выполнения которой переменным x, y и z присваивается значение 3. Инструкции могут быть и более замысловатыми. В листинге 1.6 целочисленным переменным n и m командой n=(m=6)+3 присваиваются значения 9 и 6 соответственно.

#include <iostream>
using namespace std;
int main()
{
int n,m;
n=(m=6)+3;
cout<<m<<«\n»;
cout<<n<<«\n»;
return 0;
}

В соответствии с приведенной командой сначала вычисляется выражение m=6, значением которого является 6, и при этом такое же значение присваивается переменной m. Далее к этому значению прибавляется число 3 и результат присваивается переменной n.

Еще одна особенность оператора присваивания связана с преобразованием типа в выражениях, содержащих этот оператор. Если в инструкции вида переменная=выражение тип результата, возвращаемого выражением, не совпадает с типом переменной, имеет место автоматическое преобразование типов. При этом тип значения выражения приводится в соответствие с типом переменной. Результат такой операции существенно зависит от того, из какого в какой тип данных осуществляется преобразование. В некоторых случаях может иметь место потеря данных: например, если переменной типа int присваивается значение переменной типа double, как в листинге 1.7.

#include <iostream>
using namespace std;
int main()
{
int a;
double x=3.5;
a=x;
cout<<«x=»<<x<<«\n»;
cout<<«a=»<<a<<«\n»;
return 0;
}

В программе объявляется целочисленная переменная a типа int и инициализируется переменная x типа double со значением 3.5. Далее в программе переменной a в качестве значения присваивается переменная x. В данном случае речь идет о том, что переменной типа int присваивается значение типа double. Поскольку диапазон значений для типа double шире диапазона значений для типа int, происходит урезание значения. В частности, при присваивании отбрасывается дробная часть числа, и переменная a получает значение 3. Если бы переменной типа double присваивалось значение типа int, таких проблем не возникало бы.

Преобразование типов может проявляться и совершенно по-иному. В листинге 1.8 приведен пример кода программы, в которой переменной типа char присваивается значение типа int.

#include <iostream>
using namespace std;
int main(){
char x;
int n=68;
int z;
x=n;
z=’D’;
cout<<«x=»<<x<<«\n»;
cout<<«z=»<<z<<«\n»;
return 0;
}

Целочисленной переменной n типа int присваивается значение 68. Далее эта переменная присваивается в качестве значения переменной x char-типа. В результате автоматического преобразования типов переменная x, в соответствии с кодовой таблицей, получает символьное значение D. В этом же программном коде проиллюстрирована обратная процедура: командой z=’D’ целочисленной переменной z присваивается в качестве значения символ D. В результате автоматического преобразования символов этой переменной на самом деле будет присвоен целочисленный код символа в кодовой таблице (значение 68).

Автоматическое приведение типов в некоторых случаях может проявляться достаточно неожиданным образом. Например, если операндами при делении являются целые числа, выполняется целочисленное деление. Допустим, в программе объявлены переменные int n=13, m=5. Результатом выражения n/m является число 2 (целая часть от деления 13 на 5). Для явного приведения типа выражения тот тип, к которому следует привести выражение, указывается в круглых скобках перед выражением. Чтобы в приведенном примере деление было обычным, не целочисленным, можно воспользоваться командой (double) n/m. В результате получим 2.6.

Тернарный оператор

В С++ есть тернарный оператор (у оператора три операнда), который позволяет в зависимости от некоторого условия (первый операнд) выполнять различные действия (второй и третий операнды). Синтаксис вызова оператора таков: условие?выражение1:выражение2. Фактически тернарный оператор представляет собой сокращенную форму условного оператора. Пример вызова тернарного оператора приведен в листинге 1.9.

#include <iostream>
using namespace std;
int main(){
int n;
double x;
cout<<«Enter n = «;
cin>>n;
x=n>0?5.4:3.2;
cout<<«x = «<<x<<«\n»;
return 0;
}

В программе объявляются две переменные: целочисленная переменная n типа int и переменная x типа double. Значение переменной n вводится с клавиатуры пользователем, а значение переменной x определяется с помощью команды x=n>0?5.4:3.2. Дело в том, что тернарный оператор возвращает значение. Сначала проверяется указанное первым операндом условие. Если условие выполнено, вычисляется выражение1 после вопросительного знака. Если условие не выполнено, вычисляется выражение2 после двоеточия. Тернарным оператором в качестве значения возвращается значение вычисленного выражения.

В программе командой n>0?5.4:3.2 проверяется условие n>0, и если это так, возвращается значение 5.4. В противном случае возвращается значение 3.2.

На практике в тернарных операторах используются более сложные конструкции, чем просто возвращение в качестве значения числа. Обычно прибегают к вызову в тернарных операторах функций, что позволяет не просто возвращать значение в зависимости от проверяемого условия, но и выполнять целые последовательности действий.

***

Источники:

*https://unetway.com/tutorial/c-operatory

*https://codernet.ru/books/c_plus/samouchitel_c_s_primerami_i_zadachami_aleksandr_vasilev/

*https://monitorbank.ru/operatory-c-tipy-i-primery/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *