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

   ⁄ 

 Обновлено 5 Мар 2017

  ⁄   

Существуют два унарных арифметических оператора: плюс (+) и минус (-). Унарные операторы – это те, которые применяются только к одному операнду.

Оператор Символ Пример Операция
Унарный плюс + +x Значение x
Унарный минус -x Отрицательное значение x

Унарный оператор плюс возвращает значение операнда. Другими словами, +5 = 5, +х = х. В основном, вам не придется его использовать, по большей части его добавили в качестве поддержания симметрии с унарным оператором минус. Унарный оператор минус возвращает операнд, умноженный на -1. Например, если х = 5, то -х = -5.

Оба этих оператора нужно размещать непосредственно перед самим операндом, без пробела между ними (-x, не − x).

Не следует путать унарный оператор минус с бинарным оператором вычитания, хоть они и используют один и тот же символ. Например, в выражении х = 5 - -3;, первый минус – это оператор вычитания, а второй — унарный минус.

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

Их есть 5. Бинарные операторы – это те, которые применяются к двум операндам (слева и справа).

Оператор Символ Пример Операция
Сложение + x + y x плюс y
Вычитание x − y x минус y
Умножение * x * y x умножить на y
Деление / x / y x разделить на y
Деление с остатком % x % y Остаток от деления x / y

Операторы сложения, вычитания и умножения работают так же, как и в обычной математике. А вот деление и деление с остатком рассмотрим детальнее.

Деление целых чисел и чисел типа с плавающей точкой

Оператор деления имеет два режима. Если оба операнда – целые числа, то оператор выполняет целочисленное деление. Т.е. любая дробь (больше, меньше) отбрасывается и возвращается целое значение, округления нет. Например, 7 / 4 = 1.

Если один или оба операндов типа с плавающей точкой, то тогда будет выполняться деление типа с плавающей точкой. Здесь уже дробь присутствует. Например: 7.0 / 3 = 2.333, 7 / 3.0 = 2.333 и 7.0 / 3.0 = 2.333.

Попытки деления на 0 (или на 0.0) станут причиной сбоя в вашей программе, это правило не следует забывать!

Использование static_cast <> в делении

В уроке 35 о символьном типе char, мы использовали оператор static_cast <> для вывода символов ASCII, как целых чисел.

Аналогичным образом мы можем использовать static_cast <> для конвертации целого числа в число типа floating point. Таким образом, вместо целочисленного деления, будет деление типа с плавающей точкой. Например:

Результат:

int / int = 1
double / int = 1.75
int / double = 1.75
double / double = 1.75

Оператор деления с остатком в C++

Этот оператор (%) работает только с целочисленными операндами и возвращает остаток после целочисленного деления. Например, 7 / 4 = 1 с остатком 3, таким образом, 7 % 4 = 3. Еще пример: 25 / 7 = 3 с остатком 4, таким образом, 25 % 7 = 4. Остаток составляет не дробь, а целое число. 36 % 5 = 1, в числе 36 только 35 делится на 5 без остатка, тогда 36 – 35 = 1, 1 – остаток и результат.

Данный оператор чаще всего используют для проверки деления нацело одних чисел на другие (без остатка): если х % у == 0, то х делится нацело на у.

Например, мы хотим написать программу, которая выводит числа от 1 до 100 по 20 значений в каждой строке. Мы можем использовать оператор деления с остатком для создания разрыва строк. Хоть мы еще и не рассматривали стейтмент while, в этой программе всё максимально просто и понятно:

Результат:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

О while мы поговорим в следующих уроках.

Отрицательные числа в делении до C++ 11

До C++ 11, если любой из операндов целочисленного деления отрицательный, то компилятор округляет результат самостоятельно! Например, результатом -5 / 2  может быть либо -3, либо -2. Однако, большинство современных компиляторов округляют числа в сторону 0 (например, в -5 / 2 результатом будет -2). В спецификации C++ 11 определили, что компилятор должен всегда округлять к 0 (или, проще говоря, просто отбрасывать дробь).

Также до C++ 11, если один из операндов оператора деления с остатком является отрицательным, то результаты могут быть как положительными, так и отрицательными! Например, ответом -5 % 2 может быть как 1, так и -1. В спецификации C++ 11 решили сделать так, чтобы результат a % b был того же знака, что и значение а.

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

Оператор Символ Пример Операция
Присваивание = 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

До этого момента, когда вам нужно было добавить число 5 к переменной, вы делали так:

Это работает, но это не совсем красиво и требуется два оператора для выполнения.

Так как стейтменты, типа х = х + 5 являются очень распространенными, то C++ предоставил 5 арифметических операторов присваивания, для удобства. Вместо х = х + 5, вы можете написать х += 5. Вместо х = х * у, вы можете написать х *= у.

Где оператор возведения в степень в C++?

В C++ вместо оператора возведения в степень — функция pow(), которая находится в библиотеке cmath. pow(base, exponent) – это эквивалент baseexponent. Стоит отметить, что параметры pow() —  типа double, поэтому можно использовать не только целые числа, но и дробные.

Тест

1) Каков результат следующего выражения: 6 + 5 * 4 % 3?

2) Напишите программу, которая просит пользователя ввести целое число, а  затем сообщает, является ли число четным или нечетным. Напишите функцию isEven(), которая возвращает true, если целое число – четное. Используйте оператор деления с остатком, чтобы определить четность числа.

Подсказка: Используйте стейтменты if и оператор сравнения (==).

Ответы

Ответ 1

Поскольку операторы * и % имеют более высокий приоритет, чем +, то + будет выполняться последним. Мы можем переписать наше выражение так: 6 + (5 * 4 % 3). Операторы * и % имеют одинаковый приоритет, так что здесь решает ассоциативность. Ассоциативность операторов * и % слева направо, так что левый оператор будет выполняться первым. Получается: 6 + ((5 * 4) % 3).

6 + ((5 * 4) % 3) = 6 + (20 % 3) = 6 + 2 = 8

Ответ 2

Примечание: Возможно, вы хотели написать или написали функцию isEven() так:

Хоть этот способ тоже рабочий, но он сложнее. Посмотрим, как его можно упростить. Во-первых, давайте вытащим условие if и присвоим его отдельной переменной bool.

Теперь стейтмент if выше будто говорит: «если isEven — true, то возвращаем true, в противном случае (если isEven — false) возвращаем false». Мы же можем сразу возвращать isEven:

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

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (12 оценок, среднее: 4,42 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *