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

  Юрий Ворон  | 

    | 

  Обновлено 9 Окт 2018  | 

 12904

 ǀ   18 

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

Оператор Символ Пример Операция
Унарный плюс + +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 (72 оценок, среднее: 4,78 из 5)
Загрузка...

Комментариев: 18

  1. Andrey:

    По примеру задачки из итогового теста (если точней, то по примеру вашего решения) — сделал вот так.
    Попробовал — работает.
    Посмотрел ваше решение тут — узнал опять много нового 🙂
    Например то, что при инициализации переменной можно делать вот так

    (почему-то не подумал бы, что проверка == будет работать при инициализации тоже).
    А вот то, что return может и сам посчитать — уже знал, но забыл 🙁 Так бы сразу через него и сделал, но получилось вообще через if о_О

    Кстати по прошлым примерам, когда мы все действия запихивали каждое в свою ф-цию, сделал всю программу на сколько смог. Пытался и последний if впихнуть, но с ним что-то не захотело… 🙂 Только вот может в больших программах это и имеет смысл, но вот в таких — кажется излишне громоздким и не нужным. Ваш пример здесь намного удобней и красивей смотрится.
    Кстати вопрос.
    Задачки — тоже с источника, или сами делаете?)

  2. Андрей:

    Решил сделать вот так, надеюсь, что правильно.

  3. Andrey:

    немного упростил IsEven

  4. Алексей:

  5. Dennis:

    У меня вопрос, а зачем вот так расписывать, когда , если нам нужно вывести просто результат ?

    Если только для подачи материала ? если так — то гуд.

  6. SuRprizZe:

    Думаю это ,не плохое решение.

    1. Юрий Юрий:

      Плохое. Одна функция должна выполнять одну задачу. У вас все задачи выполняет одна функция.

      1. Алексей:

        И красивее будет, если setlocale(LC_ALL, "ru"); Без нее сейчас как без рук. Для понимания лучше.

      2. Алексей:

        И вот вопрос: при вводе 5, сообщается о нечетности. А при вводе 5.5… тоже сообщается о нечетности)))) почему? Переменная int.

        1. Юрий Юрий:

          Потому что любая дробь отбрасывается, а не округляется. Будь у вас 5.99 — эта дробь отбросится и останется 5.

  7. Максим:

    Я так сделал

    1. Li4ik Li4ik:

      Хорошее решение, действительно.

    2. somebox:

      У меня похожий вариант:

      Не понимаю, зачем использовать с bool. По мне, это усложняет код.

  8. Ka4:

    так можно же?)

    1. Li4ik Li4ik:

      Да, можно и так. Как вариант.

    2. Александр:

      Возвращение к единице обратно

  9. Андрей:

    А как быть с нечетными 1 и-1?

    1. Li4ik Li4ik:

      Так ведь программа правильно работает. 1 и -1 — нечетные числа.

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

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