Статьи

Учебные материалы по языку C++ — от основ до продвинутых тем

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

Страница 13 из 43 · 2026-10-25 · 8 мин чтения

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

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

В C++ основные арифметические операторы:

ОператорНазначениеПример
+Сложение5 + 3
-Вычитание5 - 3
*Умножение5 * 3
/Деление6 / 3
%Остаток от деления целых чисел7 % 3
++Увеличение на единицуvalue++
--Уменьшение на единицуvalue--

Сложение (+)

Оператор + складывает два значения и возвращает результат.

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

В переменной result будет храниться значение 15.

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

#include <iostream>int main() {    int health = 75;    int bonus = 20;    std::cout << health + bonus << '\n';    return 0;}

Вывод:

95

Вычитание (-)

Оператор - вычитает второе значение из первого.

int health = 100;int damage = 25;int remainingHealth = health - damage;

После вычисления remainingHealth будет равен 75.

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

int money = 500;int purchasePrice = 150;money = money - purchasePrice;

Теперь в переменной money хранится 350.

Умножение (*)

Оператор * умножает два значения.

int price = 50;int quantity = 4;int total = price * quantity;

Результат — 200.

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

double speed = 3.5;double time = 4.0;double distance = speed * time;

В переменной distance будет храниться 14.0.

Деление (/)

Оператор / делит первое значение на второе.

int a = 20;int b = 4;int result = a / b;

Результат — 5.

Однако при делении целых чисел важно учитывать особенность C++: дробная часть результата отбрасывается.

int result = 7 / 2;

В результате переменная result получит значение 3, а не 3.5.

Если необходимо получить дробный результат, используй float или double.

double result = 7.0 / 2.0;

Результат — 3.5.

Тип переменной, в которую записывается результат, сам по себе не делает целочисленное деление дробным:

double result = 7 / 2; // Получится 3.0

Оба операнда здесь имеют тип int, поэтому сначала выполняется целочисленное деление. Только после этого результат преобразуется в double.

Правильный вариант:

double result = 7.0 / 2;

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

Остаток от деления (%)

Оператор % возвращает остаток от деления целых чисел.

int result = 10 % 3;

Результат — 1, поскольку \(10 = 3 \cdot 3 + 1\).

Ещё несколько примеров:

int a = 12 % 5; // 2int b = 15 % 4; // 3int c = 20 % 2; // 0

Оператор % часто используется для проверки чётности числа.

int number = 8;if (number % 2 == 0) {    // Число чётное}

Если остаток от деления на 2 равен нулю, число чётное. В противном случае оно нечётное.

Оператор % применяется к целочисленным операндам. Для вычисления остатка от деления дробных чисел можно использовать функцию std::fmod из заголовка <cmath>.

Приоритет арифметических операторов

Если выражение содержит несколько операторов, C++ вычисляет его с учётом правил приоритета и ассоциативности.

Например:

int result = 2 + 3 * 4;

Сначала выполняется умножение, затем сложение. Результат — 14.

Основной порядок приоритета арифметических операторов от высокого к низкому:

  1. Унарные +, -, ++, --.
  2. Умножение, деление и остаток: *, /, %.
  3. Сложение и вычитание: +, -.

Скобки позволяют явно задать порядок вычислений:

int a = 2 + 3 * 4;   // 14int b = (2 + 3) * 4; // 20

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

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

Инкремент (++)

Инкремент увеличивает значение переменной на единицу.

int count = 5;count++;

Теперь count равен 6.

Есть две формы инкремента: постфиксная и префиксная.

Постфиксный инкремент

При записи value++ значение выражения определяется до увеличения переменной.

int value = 5;int result = value++;

После выполнения:

  • result равен 5;
  • value равен 6.

Префиксный инкремент

При записи ++value переменная сначала увеличивается, после чего выражение получает новое значение.

int value = 5;int result = ++value;

После выполнения:

  • result равен 6;
  • value равен 6.

Если нужно просто увеличить переменную, обе формы подходят:

value++;++value;

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

Декремент (--)

Декремент уменьшает значение переменной на единицу.

int count = 10;count--;

Теперь count равен 9.

Как и инкремент, декремент имеет две формы.

int a = 5;int first = a--; // first = 5, a = 4int b = 5;int second = --b; // second = 4, b = 4

Постфиксная форма возвращает старое значение выражения, а префиксная — новое.

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

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

ОператорЭквивалентная запись
+=a = a + b
-=a = a - b
*=a = a * b
/=a = a / b
%=a = a % b

Например:

int score = 100;score += 20; // 120score -= 10; // 110score *= 2;  // 220score /= 4;  // 55

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

Обрати внимание: для /= и %= действуют те же ограничения, что и для соответствующих операторов деления и остатка.

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

Если операнды имеют разные числовые типы, C++ применяет правила преобразования типов.

int a = 10;double b = 2.5;double result = a + b;

В этом случае a преобразуется к подходящему дробному типу, а результат будет равен 12.5.

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

Пример: расчёт урона и оставшегося здоровья

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

#include <iostream>int main() {    int health = 100;    int damage = 25;    int healing = 10;    health -= damage;    health += healing;    std::cout << "Здоровье: " << health << '\n';    return 0;}

Результат:

Здоровье: 85

Сначала из здоровья вычитается урон, а затем добавляется восстановленное здоровье:

  • Начальное значение: 100.
  • После получения урона: 75.
  • После лечения: 85.

Обрати внимание: арифметические операторы сами по себе не ограничивают результат диапазоном от 0 до 100. Если такие ограничения необходимы, их нужно реализовать отдельно.

Частые ошибки

Ожидание дробного результата от целочисленного деления

double result = 5 / 2; // 2.0, а не 2.5

Чтобы получить дробный результат, хотя бы один операнд должен иметь дробный тип:

double result = 5.0 / 2;

Деление на ноль

int a = 10;int b = 0;// int result = a / b; // Нельзя выполнять

Перед делением проверь, что делитель не равен нулю.

Неправильное понимание остатка

int result = 10 % 4; // 2

Оператор % возвращает остаток, а не результат деления.

Путаница между value++ и ++value

int value = 5;int a = value++; // a = 5, value = 6

Если требуется использовать новое значение сразу, можно применить префиксную форму:

int value = 5;int a = ++value; // a = 6, value = 6

Переполнение знакового целого типа

Значение знакового целочисленного типа нельзя безопасно увеличивать за пределы его представимого диапазона. Такое переполнение приводит к неопределённому поведению.

#include <limits>int value = std::numeric_limits<int>::max();// value++; // Переполнение знакового типа

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

Итог

  • +, -, * и / выполняют основные арифметические операции.
  • % возвращает остаток от деления целых чисел.
  • ++ и -- увеличивают и уменьшают значение на единицу.
  • Префиксная и постфиксная формы отличаются значением выражения.
  • Составные операторы +=, -=, *=, /= и %= упрощают изменение переменных.
  • Приоритет операторов определяет порядок вычислений, а скобки позволяют задать его явно.
  • Целочисленное деление отбрасывает дробную часть.
  • Перед делением нужно проверять делитель, а при работе с целыми числами — учитывать диапазон типа.