C++ | Арифметические операции
Последнее обновление: 12.09.2017
Арифметические операции производятся над числами. Значения, которые участвуют в операции, называются операндами. В языке программирования C++ арифметические операции бинарными (производятся над двумя операндами) и унарными (выполняются над одним операндом). К бинарным операциям относят следующие:
+
Операция сложения возвращает сумму двух чисел:
int a = 10; int b = 7; int c = a + b; // 17 int d = 4 + b; // 11
—
Операция вычитания возвращает разность двух чисел:
int a = 10; int b = 7; int c = a - b; // 3 int d = 41 - b; // 34
*
Операция умножения возвращает произведение двух чисел:
int a = 10; int b = 7; int c = a * b; // 70 int d = b * 5; // 35
/
Операция деления возвращает частное двух чисел:
int a = 20; int b = 5; int c = a / b; // 4 double d = 22. 5 / 4.5; // 5
При делении стоит быть внимательным, так как если в операции участвуют два целых числа, то результат деления будет округляться до целого числа, даже если результат присваивается переменной float или double:
double k = 10 / 4; // 2 std::cout << k;
Чтобы результат представлял числос плавающей точкой, один из операндов также должен представлять число с плавающей точкой:
double k = 10.0 / 4; // 2.5 std::cout << k;
%
Операция получения остатка от целочисленного деления:
int a = 33; int b = 5; int c = a % b; // 3 int d = 22 % 4; // 2 (22 - 4*5 = 2)
Также есть две унарные арифметические операции, которые производятся над одним числом: ++ (инкремент) и — (декремент). Каждая из операций имеет две разновидности: префиксная и постфиксная:
Префиксный инкремент.
Увеличивает значение переменной на единицу и полученный результат используется как значение выражения ++x
int a = 8; int b = ++a; std::cout << a << "\n"; // 9 std::cout << b << "\n"; // 9
Постфиксный инкремент.
Увеличивает значение переменной на единицу, но значением выражения x++ будет то, которое было до увеличения на единицу
int a = 8; int b = a++; std::cout << a << "\n"; // 9 std::cout << b << "\n"; // 8
Префиксный декремент.
Уменьшает значение переменной на единицу, и полученное значение используется как значение выражения —x
int a = 8; int b = --a; std::cout << a << "\n"; // 7 std::cout << b << "\n"; // 7
Постфиксный декремент.
Уменьшает значение переменной на единицу, но значением выражения x— будет то, которое было до уменьшения на единицу
int a = 8; int b = a--; std::cout << a << "\n"; // 7 std::cout << b << "\n"; // 8
Арифметические операции вычисляются слева направо. Одни операции имеют больший приоритет чем другие и поэтому выполняются вначале. Операции в порядке уменьшения приоритета:
+ (инкремент), — (декремент) |
* (умножение), / (деление), % (остаток от деления) |
+ (сложение), — (вычитание) |
Приоритет операций следует учитывать при выполнении набора арифметических выражений:
int a = 8; int b = 7; int c = a + 5 * ++b; // 48 std::cout << c;
Хотя операции выполняются слева направо, но вначале будет выполняться операция инкремента ++b
, которая увеличит значение переменной
b и возвратит его в качестве результата, так как эта операция имеет больший приоритет. Затем выполняется умножение 5 * ++b
,
и только в последнюю очередь выполняется сложение a + 5 * ++b
Скобки позволяют переопределить порядок вычислений. Например:
int a = 8; int b = 7; int c = (a + 5) * ++b; // 104 std::cout << c;
Несмотря на то, что операция сложения имеет меньший приоритет, но вначале будет выполняться именно сложение, а не умножение, так как операция сложения заключена в скобки.
НазадСодержаниеВперед
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 + 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
Оригинал статьи:
- 5.2 — Arithmetic operators
Теги
C++ / CppLearnCppstatic_castДля начинающихОбучениеОператор (программирование)Оператор присваиванияПрограммированиеЦелочисленное делениеНазад
Оглавление
Вперед
арифметических выражений и приоритет операторов в C | Учебники по программированию на C
Арифметическое выражение представляет собой комбинацию переменных, констант и арифметических операторов.
В C поддерживаются следующие арифметические операторы:+
, -
, *
, /
и %
. Операнды включают целые числа и числа с плавающей запятой. Некоторые алгебраические выражения и соответствующие им выражения C приведены в следующей таблице.Алгебраическое выражение | Выражение C |
---|---|
| (а + б) * (а–б) |
| (а * б) / с |
| 2 * х * х + 3 * х |
Арифметические выражения оцениваются с помощью оператора присваивания вида переменная = выражение
c = a - b / d + e
Приоритет арифметических операторов в C
Чтобы однозначно определить значение и значение выражения, мы применяем правила приоритета и ассоциативности операторов. Арифметические выражения без круглых скобок оцениваются слева направо с использованием правил приоритета операторов. В C арифметические операторы имеют два разных уровня приоритета.
- Высокий приоритет
* / %
- Низкий приоритет
+ -
Базовая процедура вычисления выражения включает два прохода слева направо. Операторы с высоким приоритетом применяются во время первого прохода, а операторы с низким приоритетом применяются во время второго прохода.
Например, оператор x = 8 – 15 / 5 + 2 * 5 – 7 оценивается следующим образом:
- Первый проход
-
x = 8 - 5 + 2 * 5 -7
1
1 x = 8 - 5 + 10 - 7
-
-
x = 3 + 10 - 7
-
x = 13 - 7
-
x = 6
Однако можно использовать круглые скобки для изменения порядка вычисления выражения. Выражение в скобках имеет наивысший приоритет. Следующие правила используются для вычисления выражений, содержащих скобки.
- Подвыражения в скобках оцениваются слева направо.
- При наличии вложенных скобок оценка начинается с самого внутреннего подвыражения.
- Порядок применения операторов при вычислении подвыражений определяется с помощью правила приоритета.
- Если в подвыражении присутствуют два или более оператора с одинаковым уровнем приоритета, применяется правило ассоциативности.
- Арифметические выражения оцениваются слева направо с использованием правил старшинства.
- Выражения в круглых скобках имеют наивысший приоритет.
Например, оператор x = 8 – 14 / (5 + 2) * (8 – 7) вычисляется следующим образом:
- Первый проход
-
x = 8 – 14 / 7 * (8 -7)
-
x = 8 - 14 / 7 * 1
-
- Second pass
-
x = 8 - 2 * 1
-
x = 8 - 2
-
- Третий проход
-
x = 6
-
Приоритет операторов и ассоциативность в C
В следующей таблице показан полный список операторов C, их уровни приоритета и правила их ассоциации.
Оператор | Описание | Ассоциативность | Ранг |
---|---|---|---|
() | Вызов функции | Слева направо | 1 |
[] | Ссылка на элемент массива | ||
+ | Унарный плюс | Справа налево | 2 |
– | Унарный минус | ||
++ | Приращение | ||
— | Уменьшение | ||
! | Логическое отрицание | ||
~ | Единицы дополняют | ||
* | Справочник указателя | ||
и | Адрес | ||
размер | Размер объекта | ||
(тип) | Тип литой (переделка) | ||
* | Умножение | Слева направо | 3 |
/ | Подразделение | ||
% | Модуль | ||
+ | Дополнение | Слева направо | 4 |
– | Вычитание | ||
<< | Сдвиг влево | Слева направо | 5 |
>> | Правый сдвиг | ||
< | Менее | Слева направо | 6 |
<= | Меньше или равно | ||
> | Больше | ||
>= | Больше или равно | ||
== | Равенство | Слева направо | 7 |
Побитовое исключающее ИЛИ | Слева направо | 9 | |
| | Побитовое ИЛИ | Слева направо | 10 |
&& | Логическое И | Слева направо | 11 |
|| | Логическое ИЛИ | Слева направо | 12 |
?: | Условный оператор | Справа налево | 13 |
= | Оператор присвоения | Справа налево | 14 |
, | Оператор запятой | Слева направо | 15 |
5.
2 — Арифметические операторы — Learn C++Alex
Унарные арифметические операторы
Существует два унарных арифметических оператора: плюс (+) и минус (-). Напоминаем, что унарные операторы — это операторы, которые принимают только один операнд.
Operator | Symbol | Form | Operation |
---|---|---|---|
Unary plus | + | +x | Value of x |
Unary minus | - | -x | Negation of x |
Унарный минус возвращает операнд, умноженный на -1. Другими словами, если x = 5, -x равно -5.
Унарный оператор плюс возвращает значение операнда. Другими словами, +5 равно 5, а +x равно x. Как правило, вам не нужно использовать этот оператор, поскольку он избыточен. Он был добавлен в основном для обеспечения симметрии с унарный минус оператор.
Для удобства чтения оба этих оператора должны быть размещены непосредственно перед операндом (например, -x
, а не - x
).
Не путайте унарный оператор минус с оператором двоичного вычитания , который использует тот же символ. Например, в выражении х = 5 - -3;
, первый минус — это оператор двоичного вычитания , а второй — унарный оператор минус .
Двоичные арифметические операторы
Существует 5 двоичных арифметических операторов. Бинарные операторы — это операторы, которые принимают левый и правый операнд.
Operator | Symbol | Form | Operation |
---|---|---|---|
Addition | + | x + y | x plus y |
Subtraction | - | x - y | x minus у |
Умножение | * | x * y | x multiplied by y |
Division | / | x / y | x divided by y |
Modulus (Remainder) | % | 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
, потому что дробь отброшена.
Использование static_cast для деления целых чисел с плавающей запятой
Вышеизложенное поднимает вопрос: если у нас есть два целых числа и мы хотим разделить их без потери дроби, как мы это сделаем?
В уроке 4.12 — Введение в преобразование типов и static_cast мы показали, как можно использовать оператор static_cast<> для преобразования char в целое число, чтобы оно печаталось как целое, а не как символ.
Мы можем аналогичным образом использовать static_cast<> для преобразования целого числа в число с плавающей запятой, чтобы мы могли выполнить деление с плавающей запятой вместо целочисленного деления . Рассмотрим следующий код:
#includeосновной () { интервал х{ 7 }; интервал у { 4 }; std::cout << "int / int = " << x / y << '\n'; std::cout << "double / int = " << static_cast (x) / y << '\n'; std::cout << "int / double = " << x / static_cast (y) << '\n'; std::cout << "double / double = " << static_cast (x) / static_cast (y) << '\n'; вернуть 0; }
Результат:
int / int = 1 двойной / интервал = 1,75 инт / двойной = 1,75 двойной / двойной = 1,75
Вышеприведенное показывает, что если любой из операндов является числом с плавающей запятой, результатом будет деление с плавающей запятой, а не целочисленное деление.
Деление на 0 и 0.0
Попытка разделить на целое число 0
приведет к неопределенному поведению, так как результаты математически не определены!
#includeосновной () { std::cout << "Введите делитель: "; интервал х{}; std::cin >> х; std::cout << "12 / " << x << " = " << 12 / x << '\n'; вернуть 0; }
Если вы запустите указанную выше программу и введете 0
, ваша программа, скорее всего, выйдет из строя. Идите и попробуйте, это не повредит вашему компьютеру.
Результат деления на значение с плавающей запятой 0.0
определяется реализацией (это означает, что поведение определяется компилятором/архитектурой). В архитектурах, поддерживающих формат с плавающей запятой IEEE754, результатом будет NaN или Inf. На других архитектурах результатом, вероятно, будет неопределенное поведение.
Вы можете увидеть, что показывает ваш компилятор, запустив следующую программу и введя 0.0
:
#includeосновной () { std::cout << "Введите делитель: "; двойной х {}; std::cin >> х; std::cout << "12 / " << x << " = " << 12 / x << '\n'; вернуть 0; }
Операторы арифметического назначения
Оператор | Символ | Форма | Операция |
---|---|---|---|
ВСЕГДА | = | . Оставить комментарий
|