3.02. Операторы в C++.md


Теперь, когда вы умеете создавать переменные и хранить в них данные, пора научиться с этими данными работать! Для этого в C++ существуют операторы — специальные символы, которые выполняют различные действия: складывают числа, сравнивают значения или объединяют логические условия. В этом параграфе вы узнаете, как использовать основные операторы, чтобы заставить Рудирон выполнять осмысленные действия: считать шаги робота, проверять показания датчика или принимать решения. Давайте разберёмся, как это работает!

Оператор присваивания (=)

Это самый первый и самый важный оператор, с которым вы столкнётесь. Он позволяет положить значение в «коробку»-переменную. В C++ для этого используется знак =.

Оператор присваивания работает справа налево - он берёт значение справа от знака = и помещает его в переменную, указанную слева.

Пример:

int ledBrightness = 100; // В переменную ledBrightness помещается значение 100

В этом примере переменной ledBrightness присваивается значение 100, которое позже можно будет использовать, например, для управления яркостью светодиода.

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

Эти операторы нужны для выполнения математических вычислений, как на уроке математики. С их помощью ваш Рудирон сможет считать, сколько шагов прошёл робот или сколько энергии осталось в батарее.

  • Сложение (+). Складывает два числа. Пример:

    int steps = 10;
    int moreSteps = 5;
    int totalSteps = steps + moreSteps; // totalSteps теперь равно 15
    
  • Вычитание (-). Вычитает одно число из другого. Пример:

    int batteryLevel = 100;
    int energyUsed = 30;
    int remaining = batteryLevel - energyUsed; // remaining теперь равно 70
    
  • Умножение (*). Умножает числа. Пример:

    int speed = 5; // метров в секунду
    int time = 3;  // секунды
    int distance = speed * time; // distance теперь равно 15 метрам
    
  • Деление (/). Делит одно число на другое. Пример:

    int totalPizzaSlices = 8;
    int friends = 4;
    int slicesPerFriend = totalPizzaSlices / friends; // slicesPerFriend равно 2
    
  • Остаток от деления (%). Возвращает остаток, который получается после целочисленного деления. Очень полезен, например, для проверки, является ли число чётным. Пример:

    int items = 7;
    int remainder = items % 2; // 7 разделить на 2 будет 3 с остатком 1. remainder равно 1.
    // Если остаток от деления на 2 равен 0, число чётное.
    

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

Эти операторы позволяют сравнивать значения и получать в ответ логический результат: true (истина) или false (ложь). Это как задать Рудирону вопрос - «Температура уже выше 30 градусов?». Ответ на этот вопрос поможет программе принять решение.

  • Равно (==). Проверяет, равны ли два значения. Не путайте с =! Пример:

    int targetTemp = 25;
    int currentTemp = 25;
    bool areEqual = (targetTemp == currentTemp); // areEqual будет true
    
  • Не равно (!=). Проверяет, что значения не равны. Пример:

    int levelA = 10;
    int levelB = 20;
    bool areDifferent = (levelA != levelB); // areDifferent будет true
    
  • Больше (>) и Меньше (<). Проверяют, больше или меньше одно значение другого. Пример:

    int sensorValue = 50;
    int threshold = 30;
    bool isHigh = (sensorValue > threshold); // isHigh будет true
    
  • Больше или равно (>=) и Меньше или равно (<=). Пример:

    int speed = 60;
    int speedLimit = 60;
    bool isLegal = (speed <= speedLimit); // isLegal будет true
    

    Эти операторы - основа для принятия решений в программах. Например, «если температура >= 28, включить вентилятор».

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

Логические операторы позволяют объединять несколько условий сравнения в одно сложное. Они работают со значениями true и false, как союзы «и», «или», «не» в русском языке.

  • Логическое И (&&). Возвращает true, только если оба условия истинны. Пример:

    // Включить свет, если темно И есть движение
    bool isDark = true;
    bool motionDetected = false;
    bool turnOnLight = isDark && motionDetected; // turnOnLight будет false
    
  • Логическое ИЛИ (||). Возвращает true, если хотя бы одно из условий истинно. Пример:

    // Запустить систему, если есть питание от батареи ИЛИ от солнечной панели
    bool hasBattery = true;
    bool hasSolar = false;
    bool canRun = hasBattery || hasSolar; // canRun будет true
    
  • Логическое НЕ (!). Инвертирует (меняет на противоположное) логическое значение. Пример:

    bool isDoorClosed = false;
    bool isDoorOpen = !isDoorClosed; // isDoorOpen будет true
    

Комбинированные операторы присваивания

Эти операторы - удобный способ сократить запись. Они позволяют выполнить арифметическую операцию с переменной и сразу же записать результат обратно в неё.

Оператор Пример Эквивалентно
+= x += 5; x = x + 5;
-= x -= 3; x = x - 3;
*= x *= 2; x = x * 2;
/= x /= 4; x = x / 4;

Пример:

int brightness = 50;
brightness += 10; // Теперь brightness равно 60

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

Операторы инкремента и декремента

Это ещё более короткий способ увеличить или уменьшить значение переменной ровно на единицу. Они незаменимы при работе со счётчиками.

  • Инкремент (++). Увеличивает значение на 1. Пример:

    int clicks = 5;
    clicks++; // Теперь clicks равно 6
    
  • Декремент (--). Уменьшает значение на 1. Пример:

    int retriesLeft = 3;
    retriesLeft--; // Теперь retriesLeft равно 2
    

Условный (тернарный) оператор (? :)

Это самый компактный способ сделать выбор из двух вариантов. Он работает по принципу «условие ? значение_если_истина : значение_если_ложь».

Аналогия из жизни. «На улице дождь? (условие) Возьми зонт (значение_если_истина), иначе возьми солнечные очки (значение_если_ложь)».

Пример:

int temperature = 30;
// Если температура > 25, скорость вентилятора будет 100, иначе 0.
int fanSpeed = (temperature > 25) ? 100 : 0; 

Этот оператор очень удобен для коротких и ясных присваиваний по условию.

Преобразование типов

Иногда в программах для Рудирона нужно преобразовать данные из одного типа в другой. Например, вы получили с датчика температуру 23.7 (тип float), а на целочисленный дисплей нужно вывести 23 (тип int).

  • Неявное преобразование. Происходит автоматически, когда C++ считает это безопасным.
  • Явное преобразование. Вы сами даёте команду на преобразование, указывая нужный тип в скобках.

Пример (деление int с получением float):

int total = 10;
int count = 4;
// Если просто поделить 10 / 4, результат будет 2 (целочисленное деление).
// Чтобы получить 2.5, нужно явно преобразовать одно из чисел в float.
float average = (float)total / count; // average теперь равно 2.5

Пример (отбрасывание дробной части):

float sensorTemp = 23.7;
int displayTemp = (int)sensorTemp; // displayTemp теперь равно 23

Преобразование типов — важный инструмент при работе с данными от датчиков и при выполнении точных вычислений.

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

Когда в одном выражении используется несколько операторов, C++ выполняет их в строгом порядке, который определяется приоритетом. Это как в математике, где умножение выполняется раньше сложения.

Приоритет
(выше - раньше)
Операторы
1 ()
2 !, ++, --
3 *, /, %
4 +, -
5 <, <=, >, >=
6 ==, !=
7 &&
8 ||
9 ?:
10 =, +=, -= и др.

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

Пример:

int result1 = 2 + 3 * 4; // Сначала 3*4=12, потом 2+12=14
int result2 = (2 + 3) * 4; // Сначала 2+3=5 в скобках, потом 5*4=20

Зачем это нужно?

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


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