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++ | CodeBasics
На базовом уровне компьютеры оперируют только числами. Даже в прикладных программах на высокоуровневых языках внутри много чисел и операций над ними. К счастью, для старта достаточно знать обычную арифметику — с нее и начнем.
Для сложения двух чисел в математике мы пишем, например, 3 + 4. В программировании — то же самое. Вот программа, складывающая два числа:
// Не забываем точку с запятой в конце, // так как каждая строчка в коде - инструкция int main() { 3 + 4; return 0; }
Если запустить эту программу на выполнение, то она тихо отработает и завершиться. На экран ничего не будет выведено. Операция сложения, как и остальные операции, сама по себе ничего не делает кроме сложения. Чтобы воспользоваться результатом сложения, его нужно, например, вывести на экран.
int main() { std::cout << 3 + 4; return 0; }
После запуска на экране появится результат:
7
Кроме сложения доступны следующие операции:
* *
— умножение
* /
— деление
* -
— вычитание
%
— остаток от деленияТеперь давайте выведем на экран результат деления, а потом результат возведения в степень:
int main() { std::cout << 8 / 2; std::cout << 3 * 3 * 3; }
4 27
Задание
Выведите на экран результат деления числа 81 на 9.
Упражнение не проходит проверку — что делать? 😶Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно 🙄Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Полезное
Всегда отбивайте арифметические операторы пробелами от самих чисел (операндов) – это хороший стиль программирования. Поэтому в наших примерах
std::cout << 3 + 4
, а неstd::cout << 3+4
.Остаток от деления отбрасывается с округлением вниз. Таким образом результат деления – всегда целое число. Как работать с вещественными числами будет показано в следующих уроках.
←Предыдущий
Следующий→Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github. com/hexlet-basics
арифметических выражений и приоритет операторов в C | Учебники по программированию на 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
90 063
x = 8 - 5 + 10 - 7
-
-
х = 3 + 10 - 7
-
х = 13 - 7
-
х = 6
Эти шаги показаны на следующем рисунке.
Однако можно использовать круглые скобки для изменения порядка вычисления выражения. Выражение в скобках имеет наивысший приоритет. Следующие правила используются для вычисления выражений, содержащих скобки.
- Подвыражения в скобках оцениваются слева направо.
- При наличии вложенных скобок оценка начинается с самого внутреннего подвыражения.
- Порядок применения операторов при вычислении подвыражений определяется с помощью правила приоритета.
- Если в подвыражении присутствуют два или более оператора с одинаковым уровнем приоритета, применяется правило ассоциативности.
- Арифметические выражения оцениваются слева направо с использованием правил старшинства.
- Выражения в круглых скобках имеют наивысший приоритет.
Например, оператор x = 8 – 14 / (5 + 2) * (8 – 7) оценивается следующим образом:
- Первый проход
-
x = 8 – 14 / 7 * (8 -7)
-
x = 8 - 14 / 7 * 1
-
- Второй проход
-
x = 8 - 2 * 1
90 066 -
х = 8 - 2
-
- Третий проход
-
x = 6
-
Приоритет операторов и ассоциативность в C
В следующей таблице показан полный список операторов C, их уровни приоритета и правила их ассоциации.
Оператор | Описание | Ассоциативность | Ранг |
---|---|---|---|
() | Функциональный вызов | Слева направо | 1 |
[] | Ссылка на элемент массива | ||
+ | Унарный плюс | Справа налево | 2 |
– | Унарный минус | ||
++ | Приращение | ||
— | Уменьшение | ||
! | Логическое отрицание | ||
~ | Единицы дополняют | ||
* | Справочник указателя | ||
и | Адрес | ||
размер | Размер объекта | ||
(тип) | Тип литой (преобразование) | ||
* | Умножение | Слева направо | 3 |
/ | Подразделение | ||
% | Модуль | ||
+ | Дополнение | Слева направо | 4 |
– | Вычитание | ||
<< | Сдвиг влево | Слева направо | 5 |
>> | Правый сдвиг | ||
< | Менее | Слева направо | 6 |
<= | Меньше или равно | ||
> | Больше | ||
>= | Больше или равно | ||
== | Равенство | Слева направо | 7 |
Побитовое исключающее ИЛИ | Слева направо | 9 | |
| | Побитовое ИЛИ | Слева направо | 10 |
&& | Логическое И | Слева направо | 11 |
|| | Логическое ИЛИ | Слева направо | 12 |
?: | Условный оператор | Справа налево | 13 |
= | Оператор присвоения | Справа налево | 14 |
, | Оператор запятой | Слева направо | 15 |
Арифметические операторы в программировании на C
Операторы в C
В этом уроке мы рассмотрим, что такое арифметические операторы, и изучим различные типы арифметических операторов с помощью примеров.
Что такое арифметические операторы
Арифметические операторы в C используются для выполнения арифметических или математических операций. операции над операндами.
Арифметические операторы бывают двух типов:
- Унарные операторы — Операторы, которые оперируют или работают с одним операндом, называются унарными. операторы. Например: (++, — ).
- Бинарные операторы — Операторы, которые оперируют или работают с двумя операндами, называются бинарными. операторы. Например: ( +, – , *, /, % ).
Унарные операторы
Существует 2 типа унарных операторов:
- Инкрементный оператор ++
- Оператор декремента —
Оператор приращения ++
Оператор приращения используется для увеличения значения переменной на 1.
Существует 2 типа операторов приращения:
- Прединкремент
- Постинкремент
Pre-Increment
Оператор Pre-Increment используется для увеличения значения переменной на 1, прежде чем использовать его в выражении. В Pre-Increment значение сначала увеличивается а затем используется внутри выражения. Давайте посмотрим на пример для большего понимания.
Пример
int x=5, y; у=++х; // значение x увеличивается на 1 и затем сохраняется в y
В приведенном выше примере значение x , равное 5, является первым увеличьте на 1 и затем сохраните в x . Таким образом, результат y равен 6.
Post-Increment
Оператор Post-Increment используется для увеличения значения переменная на 1 после полного выполнения выражения, в котором используется постинкремент. В Post-Increment значение сначала используется в выражении, а затем увеличивается на 1. Давайте посмотрим на пример для большего понимания.
Пример
инт х=5, у; у=х++; // значение x сначала сохраняется в y, а затем увеличивается на 1
В приведенном выше примере сначала сохраняется значение x , равное 5 в y и после этого увеличилось на 1. Таким образом, результат y равен 5, а значение из x становится 6.
Оператор уменьшения —
Оператор уменьшения используется для уменьшения значения переменной на 1.
Существует 2 типа операторов декремента:
- Преддекремент
- Постдекремент
Pre-Decrement
Оператор Pre-Decrement используется для уменьшения значения переменной на 1, прежде чем использовать его в выражении. В Pre-Decrement значение сначала уменьшается на 1, а затем используется внутри выражения. Давайте посмотрим на пример для большего понимания.
Пример
int x=5, y; у=--х; // значение x уменьшается на 1 и затем сохраняется в y
В приведенном выше примере значение x , равное 5, является первым уменьшите на 1, а затем сохраните в x . Таким образом, результат y равен 4.
Постдекремент
Оператор постдекремента используется для уменьшения значения переменная на 1 после полного выполнения выражения, в котором используется постдекремент. В пост-декременте значение сначала используется в выражении, а затем уменьшается на 1. Давайте посмотрим на пример для большего понимания.
Пример
int x=5, y; у=х--; // значение x сначала сохраняется в y, а затем уменьшается на 1
В приведенном выше примере сначала сохраняется значение x , равное 5 в y и после этого уменьшилось на 1. Таким образом, результат y равен 5, а значение из x становится 4.
Бинарные операторы
Существует 5 типов бинарных операторов:
- + Дополнение
- — Вычитание
- * Умножение
- / Отдел
- % Модуль
+ Оператор сложения
+ Оператор сложения используется для сложения значения двух или более переменные. Давайте посмотрим на пример для большего понимания.
Пример
int x=5, y=2, z; г=х+у; // значение z становится 7
В приведенном выше примере значение x и y добавлен первым а затем сохраняется в z . Таким образом, результат z равен 7.
— Оператор вычитания
— Оператор вычитания используется для вычитания значения двух или более переменных. Давайте посмотрим на пример для большего понимания.
Пример
int x=5, y=2, z; г=х-у; // значение z становится 3
В приведенном выше примере значение y вычитается из x , а окончательный результат сохраняется в z . Таким образом, результат z равен 3.
* Оператор умножения
* Оператор умножения используется для умножения значения две и более переменных. Давайте посмотрим на пример для большего понимания.
Пример
int x=5, y=2, z; г=х*у; // значение z становится равным 10
В приведенном выше примере значение x и y является первым умножается и затем сохраняется в z . Итак, результат z равно 10.
/ Оператор деления
/ Оператор деления используется для деления значения на два или более переменные, и в результате деления возвращается частное.