Кое-что о программировании
eng   рус

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

Previous tutorial: Ввод/вывод в С++. Потоки
Next tutorial: Условные операторы: if...else if...else, switch

C++ содержит множество операторов (operator). Каждый оператор определяет какое-либо действие. Мы уже видели пару операторов: оператор присваивания = и оператор вставки <<

В данном уроке мы перечислим почти все операторы C++, но многие из них мы рассмотрим в следующих уроках.

Каждый оператор имеет один или более операндов (operand). Оператор с одним операндом называется унарным. С двумя - бинарным. У каждого оператора есть результат, это называется - вычисление оператора к какому-либо значению (evaluation of operator to some value). Другими словами, на месте оператора, после того, как он будет выполнен, останется какое-то значение. Рассмотрим оператор суммы +:

1 + 2; // результат - 3 int a = 3; int b = 5; a + b; // результат - 8

Как видите, операторы могут использовать как литералы, так и переменные. С результатом выполнения операторы мы можем делать всё, что разрешено правилами C++ - это обычное значение

Приоритет (precedence) операторов в языке C++

int c = a + b;

В данной строке - два оператора. Оператор + имеет операнды a и b. А оператор = имеет операнды c и результат a + b.

Поэтому, если в одной строке присутствует больше одного оператора, они будут выполняться в определённом порядке. Этот порядок называется приоритетом. + выполняется перед =, так как присваивание имеет меньший приоритет чем сложение.

Помимо этого, есть ещё и ассоциативность.

Ассоциативность операторов в C++

Ассоциативность - это порядок выполнения операторов, когда у них одинаковый приоритет. Посмотрим на пример. Если у нас несколько сложений, они будут выполнены друг за другом слева направо - это соответствует правилам в математике. Это ассоциативность слева направо (left to right associativity). Такой же порядок будет если в одной строке будет сложение и вычитание - у них одинаковый приоритет.

Пример ассоциативности справа налево - присваивание:

int a = 1; int b = 2; int c; c = b = a;

Вначале будет выполнено правое присваивание. Результат этого присваивания - значение, которое было присвоено переменной b. После этой строки все три переменные будут иметь значение 1.

Группы приоритета (precedence groups) в C++

Почти все группы имеют ассоциативность слева направо. Я укажу для каких групп это не так.

1. Наивысший приоритет - оператор разрешения области видимости (scope resolution). Мы уже его встречали - это два двоеточия и он используется для указания пространства имён:

std::cout;

2. Этой группе принадлежат все функциональные приведения типов (functional type casts) - об этом позже.

Точка . и ->. Операторы доступа к переменным - членам. Они используются с более продвинутыми типами данных и очень часто встречаются в реальном коде.

[] и (). Первое это индекс (subscript) - доступ к элементам массива, второе - вызов функции. Об этих операторах тоже позже.

Постинкремент (post-increment или postfix) ++ и постдекремент --. Они используются с числами и увеличивают/уменьшают их на единицу:

int a = 1; cout << a++ << endl; // 1 cout << a++ << endl; // 2 cout << a++ << endl; // 3

Постинкремент вначале возвращает текущее значение, а после этого увеличивает переменную на 1. Результат первой строки: 1 на экране, но в памяти после этой строки уже содержится 2... Назначение данных операторов - сократить количество кода. Мы можем заменить декремент/инкремент следующим кодом:

a = a + 1; a = a - 1;

3. Данная группа имеет ассоциативность справа налево. Преинкремент (pre-increment или prefix) и предекремент:

int a = 1; cout << ++a << endl; // 2 cout << ++a << endl; // 3 cout << ++a << endl; // 4

Вначале оператор добавляет единицу, а после этого возвращает значение. Префиксные и постфиксные операторы используются в разных ситуациях.

Унарные опреаторы + и -. Слово унарный означает, что оператору нужен только один операнд.

int a = 1; cout << -a << endl; // -1

Минус используется, когда нужно изменить знак числа.

Логическое и битовое (bitwise) НЕ: !, ~. Мы пока пропустим все битовые операторы. Логическое НЕ изменяет булево значение на противоположное:

bool a = true; !a; // false

Приведения типов в стиле языка C также в этой группе. Скоро мы подробно поговорим о приведении типов.

Несколько операторов для работы с памятью: выделение (allocation) new, освобождение (deallocation) delete, размер sizeof, (indirection) a*, получение адреса (address-of) a&. Например, вот так мы можем узнать размер переменной в байтах:

int a = 38422; cout << sizeof(a) << endl; // 4

4. Операторы для доступа к членам через указатели: ->* и .*.

5. Умножение *, деление / и взятие остатка %. Взятие остатка имеет много практических применений, поэтому взглянем на пример:

cout << 10 % 4 << endl;

% выполняет деление и возвращает остаток. Поэтому, в данном случае на экране будет 2. Взятие остатка есть в большинстве языков программирования.

6. Сложение + и вычитание -. Ничего интересного здесь. Также как и в математике + и - имеют меньший приоритет чем * и /.

7. Битовые смещения (bitwise shifts). Левое смещение. << и правое смещение >>. Важная вещь - это не потоковые операторы вставки/извлечения. В данном случае мы видим, что один символ имеет два значения - это называется перегрузкой операторов (operator overload). Как мы увидим в будущем, C++ использует эту особенность часто.

Битовые смещения работают с битами - они сдвигают биты влево или вправо. Это имеет интересное практическое значение. С помощью битовых смещений мы можем легко умножать/делить на степени двойки.

int a = 2 << 3; int b = 2 * 2 * 2 * 2;

Эти две строки эквивалентны и результат будет 16.

8. Сравнение: меньше <, меньше или равно <=, больше >, больше или равно >=. Они возвращают булево значение.

9. Равенство == и неравенство !=. Тоже возвращают булево значение.

10. Битовое И (AND) &. Как я писал выше, по битовым операциям у нас будет отдельный урок.

11. Битовое исключающее ИЛИ (XOR) ^.

12. Битовое ИЛИ (OR) |.

13. Логическое И (AND) &&.

14. Логическое ИЛИ (OR) ||. Все логические опреации возвращают булево значение. С помощью логических И и ИЛИ мы можем построить более сложные условия (тема следующего урока).

15. Данная группа имеет ассоциативность справа налево. Сюда относится оператор throw, он используется когда происходит что-то неожиданное.

Единственный тернарный оператор в C++ ?:. Слово тернарный означает, что ему требуется три операнда. Первая часть оператора - условие. Если оно истинно, выполняется вторая часть, в противном случае выполняется третья часть. В данном операторе будет выполнена только вторая или третья часть в зависимости от условия в первой части:

enemy_is_near ? shoot : run;

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

Также в этой группе несколько опреаторов присваивания. =, +=, -=, *=, /=, %= и битовые аналоги >>=, <<=, ^=, &=, |=. Мы можем ограничиться только первым - он называется прямым присваиванием (direct assignment). Другие (составные присваивания - compound assignments) позволяют сократить код. Сравним:

int a = 10; int b = 10; a = a + 5; b += 5;

Это одно и то же. Другие составные присваивания работают также.

16. Последнее - запятая ,. Вот как её можно использовать:

int a = 2, b = 3;

Здесь мы определили две int переменных на одной строке.

Заключение

Это краткий обзор операторов в C++. Мы изучим большинство из них, когда будем рассматривать соответствующие темы.

Комментарии:

14 июня 2019 г. 5:42
1 Guest
http://mewkid.net/buy-amoxicillin/ - Amoxicillin 500 Mg <a href="http://mewkid.net/buy-amoxicillin/">Amoxicillin 500mg</a> xdl.utef.about-prog.com.dmx.mk http://mewkid.net/buy-amoxicillin/
14 июня 2019 г. 6:20
2 Guest
http://mewkid.net/buy-amoxicillin/ - Amoxicillin <a href="http://mewkid.net/buy-amoxicillin/">Buy Amoxicillin Online</a> nig.dxqo.about-prog.com.gpj.pm http://mewkid.net/buy-amoxicillin/
16 июня 2019 г. 12:27
3 Guest
In my opinion you commit an error. I can defend the position. Write to me in PM, we will talk. ------ <a href=http://igrovye-avtomati.com.ua/klubnichki_igrat_besplatno.html>игровые автоматы клубничка</a> | http://igrovye-avtomati.com.ua/
19 июня 2019 г. 16:45
4 Guest
Completely I share your opinion. It seems to me it is excellent idea. I agree with you. --------- <a href=https://www.antiban.pro/>ссылка</a> | https://www.antiban.pro/
22 июня 2019 г. 3:53
5 Guest
На сайте повседневно <a href=http://bukmekers.net/264-mostbet.html>Мостбет букмекерская контора</a> передают интересные проишествия по сокере, хоккее, стритбол, неконтактный волейбол, двоеборье, bukmekers.net единоборство, теннису, гонках один плюс иных классах, что включают на прямом трансляции, также постижимы собственно на онлайн сервере. Надзирать в физических соревнованиях через презентованному веб- сайте очень сподручно, администрация произвели сверхбыстрый и легкий пользование, с http://bukmekers.net/ подмогой того всякий может включить желанный тип спорта, к тому же посетить в занимающий меню.
1 июля 2019 г. 10:07
6 Guest
In my opinion you are mistaken. Let's discuss. Write to me in PM. ------ <a href=http://7motors.md/>7motors</a> | http://7motors.md/
1 июля 2019 г. 18:09
7 Guest
Продать всяческий товар на хороших положении на стартовое количество истраченного времени сумеет лишь опытный плюс пригодный специалист, каковой знает различные особенности привлечения https://investprofit.info/passiv-earning/ покупателя к тому же исполнения разной свойственности фабриката, то есть компании необходим грамотный посредник. Брокер инвестиционный портфель условий осуществляет всяческие транзакции, какие только лишь возможно представить в коммерческой платформе, орудуя https://investprofit.info/ в определенной курсе, Вы несомненно сможете получить тех лучший достижений, в случае если пребываете в правильном сервере. Сервисный портал полинарных соглашений <a href=https://investprofit.info/>инвестиционный портфель реферат</a>, выражает абонентам сетевой ресурс, какой преподносит теорию специально под неумелых, интервью про поступлении по двойных усмотрении, виды соглашения, проектирование, бонусы и вклады, контракт пут еще и иные разделы, какие поспособствуют Вам упешно освоить поле быстрого увеличения денег с капиталом полинарных опционов. Читайте указанный справочный портал затем пребывайте на направлении различных фактов свежих активов прибыли.
15 июля 2019 г. 10:45
8 Guest
Только по-настоящему хорошая женщина способна совершить по-настоящему глупый поступок. ----- <a href=https://european-yachts.com/en/rent-yachts-seychelles>seychelles catamaran charter</a> | https://european-yachts.com
15 июля 2019 г. 16:25
9 Guest
Дети - это завтрашние судьи наши. ----- <a href=https://virtual-local-numbers.com/countries/1196-estonia-did-number.html>estonia virtual phone number</a> | https://virtual-local-numbers.com/