Арифметические операции | 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
4.2. Арифметические операции. C++ для начинающих
4.2. Арифметические операции
Таблица 4.1. Арифметические операции
Символ операции
Значение
Использование
*
Умножение
expr*expr
/
Деление
expr / expr
%
Остаток от деления
expr % expr
+
Сложение
expr + expr
—
Вычитание
expr – expr
Деление целых чисел дает в результате целое число. Дробная часть результата, если она есть, отбрасывается:
int ivall = 21 / 6;
int iva12 = 21 / 7;
И ival1, и ival2 в итоге получат значение 3.
Операция остаток (%), называемая также делением по модулю, возвращает остаток от деления первого операнда на второй, но применяется только к операндам целого типа (char, short, int, long). Результат положителен, если оба операнда положительны. Если же один или оба операнда отрицательны, результат зависит от реализации, то есть машинно-зависим. Вот примеры правильного и неправильного использования деления по модулю:
3.14 % 3; // ошибка: операнд типа double
21 % 6; // правильно: 3
21 % 7; // правильно: 0
21 % -5; // машинно-зависимо: -1 или 1
int iva1 = 1024;
double dval = 3.14159;
iva1 % 12; // правильно:
iva1 % dval; // ошибка: операнд типа double
Иногда результат вычисления арифметического выражения может быть неправильным либо не определенным. В этих случаях говорят об арифметических исключениях (хотя они не вызывают возбуждения исключения в программе). Арифметические исключения могут иметь чисто математическую природу (скажем, деление на 0) или происходить от представления чисел в компьютере – как переполнение (когда значение превышает величину, которая может быть выражена объектом данного типа). Например, тип char содержит 8 бит и способен хранить значения от 0 до 255 либо от -128 до 127 в зависимости от того, знаковый он или беззнаковый. В следующем примере попытка присвоить объекту типа char значение 256 вызывает переполнение:
#include iostream
int main() {
char byte_value = 32;
int ival = 8;
// переполнение памяти, отведенной под byte_value
byte_value = ival * byte_value;
cout «byte_value: » static_castint(byte_value) endl;
}
Для представления числа 256 необходимы 9 бит. Переменная byte_value получает некоторое неопределенное (машинно-зависимое) значение. Допустим, на нашей рабочей станции SGI мы получили 0. Первая попытка напечатать это значение с помощью:
cout «byte_va1ue: » byte_va1ue endl;
привела к результату:
byte_value:
После некоторого замешательства мы поняли, что значение 0 – это нулевой символ ASCII, который не имеет представления при печати. Чтобы напечатать не представление символа, а его значение, нам пришлось использовать весьма странно выглядящее выражение:
static_castint(byte_value)
которое называется явным приведением типа. Оно преобразует тип объекта или выражения в другой тип, явно заданный программистом. В нашем случае мы изменили byte_value на int. Теперь программа выдает более осмысленный результат:
byte_value: 0
На самом деле нужно было изменить не значение, соответствующее byte_value, а поведение операции вывода, которая действует по-разному для разных типов. Объекты типа char представляются ASCII-символами (а не кодами), в то время как для объектов типа int мы увидим содержащиеся в них значения. (Преобразования типов рассмотрены в разделе 4.14.)
Это небольшое отступление от темы – обсуждение проблем преобразования типов – вызвано обнаруженной нами погрешностью в работе нашей программы и в каком-то смысле напоминает реальный процесс программирования, когда аномальное поведение программы заставляет на время забыть о том, ради достижения какой, собственно, цели она пишется, и сосредоточиться на несущественных, казалось бы, деталях. Такая мелочь, как недостаточно продуманный выбор типа данных, приводящий к переполнению, может стать причиной трудно обнаруживаемой ошибки: из соображений эффективности проверка на переполнение не производится во время выполнения программы.
Стандартная библиотека С++ имеет заголовочный файл limits, содержащий различную информацию о встроенных типах данных, в том числе и диапазоны значений для каждого типа. Заголовочные файлы climits и cfloat также содержат эту информацию. (Об использовании этих заголовочных файлов для того, чтобы избежать переполнения и потери значимости, см. главы 4 и 6 [PLAUGER92]).
Арифметика вещественных чисел создает еще одну проблему, связанную с округлением. Вещественное число представляется фиксированным количеством разрядов (разным для разных типов – float, double и long double), и точность значения зависит от используемого типа данных. Но даже самый точный тип long double не может устранить ошибку округления. Вещественная величина в любом случае представляется с некоторой ограниченной точностью. (См. [SHAMPINE97] о проблемах округления вещественных чисел.)
Упражнение 4.1
В чем разница между приведенными выражениями с операцией деления?
double dvall = 10.0, dva12 = 3.0;
int ivall = 10, iva12 = 3;
dvall / dva12;
ivall / iva12;
Упражнение 4.2
Напишите выражение, определяющее, четным или нечетным является данное целое число.
Упражнение 4.3
Найдите заголовочные файлы limits, climits и cfloat и посмотрите, что они содержат.
Арифметические операции
Арифметические операции
Для работы с числами используют арифметические операции.
Арифметические операторы
Арифметические операторы Арифметические операторы языка VBScript представлены в табл. П2.10.Таблица П2.10. Арифметические операторы Оператор Описание — (унарный оператор) Изменение знака аргумента на противоположный — (бинарный оператор) Вычитание двух чисел + Сложение двух
Арифметические операторы
Арифметические операторы Арифметические операторы служат для выполнения арифметических действий над числами. Все арифметические операторы, поддерживаемые JavaScript, перечислены в табл. 14.2.Таблица 14.2. Арифметические операторы Арифметические операторы делятся на две
Арифметические операции
Арифметические операции + – сложение— – вычитание* – умножение/ – делениеDIV – деление нацелоMOD – остаток от деления
Арифметические операции
Арифметические операции
Унарные операции – применяются к одной переменной. ++ – увеличение на единицу (x++ выдаёт старое значение, ++x – новое значение).– – – уменьшение на единицу, аналогично операции ++.Бинарные операции – стоят между двумя переменными или
Арифметические операторы
Арифметические операторы Арифметические операторы возвращают значения, соответствующие типам числовых операндов:• + — сложение;• – — вычитание;• * — умножение;• / — деление чисел с плавающей запятой;• div — целочисленное деление с отбрасыванием остатка;• mod —
I. Арифметические операции
I. Арифметические операции + Прибавляет величину, находящуюся справа, к величине, стоящей слева — Вычитает величину, стоящую справа, из величины, указанной слева — Будучи унарной операцией, изменяет знак величины, стоящей справа * Умножает величину справа на величину,
Арифметические операции (Arithmetic operations)
Арифметические операции (Arithmetic operations)
Библиотека обеспечивает базовые классы функциональных объектов для всех арифметических операторов языка. template ‹class T›struct plus: binary_function‹T, T, T› { Т operator()(const T& x, const T& y) const {return x + y;}};template ‹class T›struct minus: binary_function‹T, T, T› { Т operator()(const T&
4.2. Арифметические операции
4.2. Арифметические операции Таблица 4.1. Арифметические операции Символ операции Значение Использование * Умножение expr*expr / Деление expr / expr % Остаток от деления expr % expr + Сложение expr + expr — Вычитание expr – expr Деление целых чисел дает в результате целое
Арифметические операции
Арифметические операции Арифметические выражения вычисляются слева направо за исключением случаев, когда возникает двусмысленность. В этих случаях арифметические операции вычисляются в соответствии с приоритетами, описанными в табл. 21.3. Например, умножение
Пример 8-2.

Пример 8-2. Арифметические операции #!/bin/bash# От 1 до 6 пятью различными способами.n=1; echo -n «$n «let «n = $n + 1» # let «n = n + 1» тоже допустимоecho -n «$n «: $((n = $n + 1))# оператор «:» обязателен, поскольку в противном случае, Bash будет#+ интерпретировать выражение «$((n = $n + 1))» как команду.echo -n «$n «n=$(($n + 1))echo
6.6 Арифметические Преобразования
6.6 Арифметические Преобразования Большое количество операций вызывают преобразования и дают тип результата одинаковым образом. Этот стереотип будет называться «обычным арифметическим преобразованием».Во-первых, любые операнды типа char, unsigned char или short преобразуются к
2.2. Арифметические операции над числами, представленными в различных системах счисления
2. 2. Арифметические операции над числами, представленными в различных системах счисления
Арифметические операции во всех позиционных системах счисления выполняются по одним и тем же правилам. Для проведения арифметических операций над числами, представленными в
54. Арифметические команды
54. Арифметические команды Такие команды работают с двумя типами:1) целыми двоичными числами, то есть с числами, закодированными в двоичной системе счисления.Десятичные числа – специальный вид представления числовой информации, в основу которого положен принцип
C Приоритет и ассоциативность операторов: определение и примеры
В этом руководстве вы узнаете о приоритете и ассоциативности операторов с помощью примеров.
Приоритет операторов
Приоритет операторов определяет, какой оператор выполняется первым, если в выражении более одного оператора.
Рассмотрим пример:
int x = 5 - 17* 6;
В C приоритет *
выше, чем -
и =
. Следовательно, 17 * 6
оценивается первым. Затем вычисляется выражение, включающее -
, так как приоритет -
выше, чем у =
.
Вот таблица приоритета операторов от высшего к низшему. Вскоре мы обсудим свойство ассоциативности .
Таблица приоритета и ассоциативности операторов
Оператор | Значение оператора | Ассоциативность | ||
---|---|---|---|---|
() [] -> . | Функциональный вызов Ссылка на элемент массива Косвенный выбор элемента Прямой выбор элемента | Слева направо | ||
! ~ + — ++ — и * размер (тип) | Логическое отрицание Побитовое (1) дополнение Унарный плюс Унарный минус Приращение Декремент Разыменование (адрес) Ссылка на указатель Возвращает размер объекта Приведение типов (преобразование) | Справа налево | ||
* / % | Умножить Разделить Остаток | Слева направо | ||
+ — | Двоичный плюс (сложение) Двоичный минус (вычитание) | Слева направо | ||
<< >> | Сдвиг влево Сдвиг вправо | Слева направо | 9Побитовое исключающее ИЛИ | Слева направо |
| | Побитовое ИЛИ | Слева направо | ||
&& | Логическое И | Слева направо | ||
|| | Логическое ИЛИ | Слева направо | ||
?: | Условный оператор | Справа налево | ||
= *= /= %= += -= &= 9= |= <<= >>= | Простое присваивание Присвоить произведение Присвоить частное Присвоить остаток Присвоить сумму Присвоить разность Присвоить побитовое И Присвоить побитовое XOR Присвоить побитовое ИЛИ Присвоить сдвиг влево Присвоить сдвиг вправо | Справа налево | ||
, | Разделитель выражений | Слева направо |
Ассоциативность операторов
Ассоциативность операторов определяет направление, в котором вычисляется выражение. Например,
б = а;
Здесь значение a присваивается b , а не наоборот. Это потому, что оператор =
ассоциативен справа налево.
Кроме того, если присутствуют два оператора с одинаковым старшинством (приоритетом), ассоциативность определяет направление их выполнения.
Рассмотрим пример:
1 == 2 != 3
Здесь операторы ==
и !=
имеют одинаковый приоритет. И их ассоциативность слева направо. Следовательно, 1 == 2
выполняется первым.
Приведенное выше выражение эквивалентно:
(1 == 2) != 3
Примечание: Если оператор содержит несколько операторов, вы можете использовать круглые скобки ()
, чтобы сделать код более читабельным.
Содержание
Таблица приоритетов операторов C
Таблица приоритетов операторов CНа этой странице перечислены все операторы C в порядке их приоритета (от самого высокого до самый низкий). |