Арифметические операции | 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 и посмотрите, что они содержат.
Арифметические операции
Арифметические операции Для работы с числами используют арифметические операции.
• Сложение – знак плюс (+). Например, 5 + 7 = 12.• Вычитание – знак минус (-). Например, 67 – 43 = 24.• Умножение – звездочка (*). Например, 2 * 2 = 4.• Деление – косая черта (/). Например, 45 / 5 = 9.• Остаток отАрифметические операторы
Арифметические операторы Арифметические операторы языка 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 в порядке их приоритета (от самого высокого до самый низкий). |