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

Добавлено 3 мая 2021 в 14:55

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

В C++ есть два унарных арифметических оператора, плюс (+) и минус (-). Напоминаем, что унарные операторы – это операторы, которые принимают только один операнд.

Унарные арифметические операторы
ОператорОбозначениеПример использованияОперация
Унарный плюс++xЗначение x
Унарный минус--xОтрицательное значение x

Оператор унарного минуса возвращает операнд, умноженный на -1. Другими словами, если x = 5, -x равно -5.

Оператор унарного плюса возвращает значение операнда. Другими словами, +5 равно 5, а +x равно x. Как правило, вам не нужно использовать этот оператор, поскольку он избыточен. Он был добавлен в основном для обеспечения симметрии с унарным оператором минус.

Для наилучшего эффекта оба этих оператора следует размещать непосредственно перед операндом (например, -x, а не - x).

Не путайте оператор унарного минуса с оператором бинарного вычитания, в котором используется тот же символ. Например, в выражении x = 5 - -3; первый минус – это оператор бинарного вычитания, а второй – оператор унарного минуса.

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

В C++ есть 5 бинарных арифметических операторов. Бинарные операторы – это операторы, которые принимают левый и правый операнды.

Бинарные арифметические операторы
ОператорОбозначениеПример использованияОперация
Сложение+x + yx плюс y
Вычитание-x - yx минус y
Умножение*x * yx, умноженное на y
Деление/x / yx, деленное на 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

Теги

C++ / CppLearnCppstatic_castДля начинающихОбучениеОператор (программирование)Оператор присваиванияПрограммированиеЦелочисленное деление

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.