5.2 – Арифметические операторы
Унарные арифметические операторы
В C++ есть два унарных арифметических оператора, плюс (+) и минус (-). Напоминаем, что унарные операторы – это операторы, которые принимают только один операнд.
Оператор | Обозначение | Пример использования | Операция |
---|---|---|---|
Унарный плюс | + | +x | Значение x |
Унарный минус | - | -x | Отрицательное значение x |
Оператор унарного минуса возвращает операнд, умноженный на -1. Другими словами, если x = 5, -x равно -5.
Оператор унарного плюса возвращает значение операнда. Другими словами, +5 равно 5, а +x равно x. Как правило, вам не нужно использовать этот оператор, поскольку он избыточен. Он был добавлен в основном для обеспечения симметрии с унарным оператором минус.
Для наилучшего эффекта оба этих оператора следует размещать непосредственно перед операндом (например, -x
, а не - x
).
Не путайте оператор унарного минуса с оператором бинарного вычитания, в котором используется тот же символ. Например, в выражении x = 5 - -3;
первый минус – это оператор бинарного вычитания, а второй – оператор унарного минуса.
Бинарные арифметические операторы
В C++ есть 5 бинарных арифметических операторов. Бинарные операторы – это операторы, которые принимают левый и правый операнды.
Оператор | Обозначение | Пример использования | Операция |
---|---|---|---|
Сложение | + | x + y | x плюс y |
Вычитание | - | x - y | x минус y |
Умножение | * | x * y | x , умноженное на y |
Деление | / | x / y | x , деленное на y |
Остаток от деления | % | x % y | остаток от деления x на y |
Операторы сложения, вычитания и умножения работают так же, как и в реальной жизни, без каких-либо оговорок.
Деление и остаток от деления требуют дополнительных пояснений. О делении мы поговорим ниже, а об остатке от деления – в следующем уроке.
Целочисленное деление и деление с плавающей запятой
Проще всего представить себе, что оператор деления имеет два разных «режима».
Если один (или оба) операнда являются значениями с плавающей точкой, оператор деления выполняет деление с плавающей точкой. Деление с плавающей точкой возвращает значение с плавающей точкой, и дробная часть сохраняется. Например, 7.0 / 4 = 1.75, 7 / 4.0 = 1.75 и 7.0 / 4.0 = 1.75. Как и во всех арифметических операциях с плавающей точкой, здесь могут возникать ошибки округления.
Если оба операнда являются целыми числами, оператор деления вместо этого выполняет целочисленное деление. Целочисленное деление отбрасывает любые дробные части и возвращает целочисленное значение. Например, 7 / 4 = 1, потому что дробная часть результата отбрасывается. Точно так же -7 / 4 = -1, потому что дробная часть опускается.
Предупреждение
До C++11 целочисленное деление с отрицательным операндом могло округляться в большую или меньшую сторону. Таким образом, -5 / 3 могло дать результат -1 или -2. Это было исправлено в C++11, где дробная часть всегда отбрасывается (округляется до 0).
Использование static_cast<>
для деления с плавающей точкой с целочисленными значениями
Сказанное выше поднимает вопрос: если у нас есть два целых числа и мы хотим разделить их без потери дробной части, как нам это сделать?
В уроке «4.11 – Символы» мы показали, как можно использовать оператор static_cast<>
для преобразования значения char
в целочисленный тип, чтобы оно печаталось как целое число, а не как символ.
Аналогичным образом мы можем использовать static_cast<>
для преобразования значения целочисленного типа в число с плавающей точкой, чтобы мы, вместо целочисленного деления, смогли выполнить деление с плавающей точкой. Рассмотрим следующий код:
#include <iostream>
int main()
{
int x{ 7 };
int y{ 4 };
std::cout << "int / int = " << x / y << '\n';
std::cout << "double / int = " << static_cast<double>(x) / y << '\n';
std::cout << "int / double = " << x / static_cast<double>(y) << '\n';
std::cout << "double / double = " << static_cast<double>(x) / static_cast<double>(y) << '\n';
return 0;
}
Эта программа дает следующий результат:
int / int = 1
double / int = 1.75
int / double = 1.75
double / double = 1.75
Приведенный выше пример показывает, что если любой из операндов является числом с плавающей точкой, результатом будет деление с плавающей точкой, а не целочисленное деление.
Деление на ноль
Попытка разделить на 0 (или 0.0) обычно приводит к сбою программы, так как результаты математически не определены!
#include <iostream>
int main()
{
std::cout << "Enter a divisor: ";
int x{};
std::cin >> x;
std::cout << "12 / " << x << " = " << 12 / x << '\n';
return 0;
}
Если вы запустите показанную выше программу и введете 0, ваша программа завершится со сбоем. Попробуйте, это не повредит вашему компьютеру.
Арифметические операторы присваивания
Оператор | Обозначение | Пример использования | Операция |
---|---|---|---|
Присваивание | = | x = y | Присвоить значение y переменной x |
Сложение с присваиванием | += | x += y | Добавить y к x |
Вычитание с присваиванием | -= | x -= y | Вычесть y из x |
Умножение с присваиванием | *= | x *= y | Умножить x на y |
Деление с присваиванием | /= | x /= y | Разделить x на y |
Остаток от деления с присваиванием | %= | x %= y | Положить остаток от x / y в x |
До этого момента, когда вам нужно было добавить 4 к переменной, вы, вероятно, делали следующее:
х = х + 4; // добавляем 4 к существующему значению x
Это работает, но немного неудобно и требует для выполнения двух операторов (operator+
и operator=
).
Поскольку написание таких инструкций, как x = x + 4
, очень распространено, C++ для удобства предоставляет пять арифметических операторов присваивания. Вместо того, чтобы писать x = x + 4
, вы можете написать x += 4
. Вместо x = x * y
вы можете написать x *= y
.
Таким образом, приведенную выше строку можно переписать так:
х += 4; // добавляем 4 к существующему значению x