Арифметический оператор: Арифметические операторы

Арифметические операторы — testing.swiftbook

5052 views 28.08.2014 admin_ 2

Язык Swift поддерживает четыре стандартных арифметических оператора для всех числовых типов:

  • сложение (+)
  • вычитание (—)
  • умножение (*)
  • деление (/)
1 + 2 // равно 3
5 - 3 // равно 2
2 * 3 // равно 6
10.0 / 2.5 // равно 4.0

В отличие от C и Objective-C арифметические операторы Swift по умолчанию не допускают переполнения типа. Контроль переполнения типа включается в Swift специальными операторами (например, a &+ b). Подробнее см. в главе Операторы переполнения.

Оператор сложения служит также для конкатенации, или же склейки, строковых значений (тип String):

"hello, " + "world"  // равно "hello, world"

Оператор целочисленного деления

Оператор целочисленного деления (a % b) показывает, остаток деления a на b.

Заметка

Оператор целочисленного деления (%) в некоторых языках называется оператором деления по модулю. Однако учитывая его действие над отрицательными числами в Swift, этот оператор, строго говоря, выполняет деление с остатком, а не по модулю.

Оператор целочисленного деления работает следующим образом. Для вычисления выражения 9 % 4 сначала определяется, сколько четверок содержится в девятке:

В одной девятке содержатся две четверки, а остатком будет 1 (выделено оранжевым цветом).

На языке Swift это записывается так:

9 % 4    // равно 1

Чтобы получить результат деления a % b, оператор % вычисляет следующее выражение и возвращает остаток:

a = (b × множитель) + остаток

где множитель показывает, сколько целых раз b содержится в a.

Подставляя в это выражение 9 и 4, получим:

9 = (4 × 2) + 1

Точно так же рассчитывается остаток, когда a отрицательно:

-9 % 4   // равно -1

Подставляя в наше выражение -9 и 4, получим:

-9 = (4 × -2) + -1

причем остаток будет равен -1.

Если b отрицательно, его знак отбрасывается. Это означает, что выражения a % b и a % -b всегда будут давать одинаковый результат.

Оператор унарного минуса

Для изменения знака числового значения служит префиксный минус (—), который называется оператором унарного минуса:

let three = 3
let minusThree = -three // minusThree равно -3
let plusThree = -minusThree // plusThree равно 3, т. е. "минус минус три"

Оператор унарного минуса (—) ставится непосредственно перед значением, без пробела.

Оператор унарного плюса

Оператор унарного плюса (+) просто возвращает исходное значение без каких-либо изменений:

let minusSix = -6
let alsoMinusSix = +minusSix // alsoMinusSix равно -6

Хотя оператор унарного плюса не выполняет никаких действий, он придает коду единообразие, позволяя зрительно отличать положительные значения от отрицательных.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

C++ | Арифметические операции

Последнее обновление: 09.02.2023

Арифметические операции производятся над числами. Значения, которые участвуют в операции, называются операндами. В языке программирования C++ арифметические операции могут быть бинарными (производятся над двумя операндами) и унарными (выполняются над одним операндом). К бинарным операциям относят следующие:

  • +

    Операция сложения возвращает сумму двух чисел:

    
    int a {10};
    int b {7};
    int c {a + b};  // 17
    int d {4 + b};  // 11
    

    В этом примере результат операций применяется для инициализации переменных, но мы также можем использовать операцию присвоения для установки значения переменных:

    
    int a {10};
    int b {7};
    int c = a + b;  // 17
    int d = 4 + b;  // 11
    
  • Операция вычитания возвращает разность двух чисел:

    
    int a {10};
    int b {7};
    int c {a - b};  // 3
    int d {4 - b};  // -3
    
  • *

    Операция умножения возвращает произведение двух чисел:

    
    int a {10};
    int b {7};
    int c {a * b};  // 70
    int d {4 * b};  // 28
    
  • /

    Операция деления возвращает частное двух чисел:

    
    int a {26};
    int b {5};
    int c {a / b};      // c = 5
    int d {4 / b};     // d = 0
    

    При делении стоит быть внимательным, так как если в операции участвуют два целых числа, то дробная часть (при ее наличии) будет отбрасываться, даже если результат присваивается переменной float или double:

    
    #include <iostream>
    
    int main()
    {
        int a {26};
        int b {5};
        float c {a / b};      // c = 5
        double d {4 / b};     // d = 0
        std::cout << "c = " << c << std::endl;
        std::cout << "d = " << d << std::endl;
    }
    

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

    
    #include <iostream>
    
    int main()
    {
        float a {26};
        int b {5};
        float c {a / b};        // c = 5. 2
        double d {4.0 / b};     // d = 0.8
        std::cout << "c = " << c << std::endl;
        std::cout << "d = " << d << std::endl;
    }
    
  • %

    Операция получения остатка от целочисленного деления:

    
    int a {26};
    int b {5};
    int c {a % b};      // c = 26 % 5 = 26 - 5 * 5 = 1
    int d {4 % b};     // d = 4 % 5 = 4
    

Некоторые особенности при работе с числами с плавающей точкой

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

1.23E-4 (0.000123) и 3.65E+6 (3650000). Мы ожидаем, что сумма будет равна 3650000,000123. Но при преобразовании в число с плавающей запятой с точностью до семи цифр это становится следующим

3.650000E+06 + 1.230000E-04 = 3.650000E+06

Или соответствующий код на С++:


#include <iostream>

int main()
{
    float num1{ 1. 23E-4  };        // 0.000123
    float num2{ 3.65E+6  };        // 3650000
    float sum {num1 + num2};       // sum =3.65e+06
    std::cout << "sum =" << sum << "\n";
}

То есть первое число никак не изменилось, поскольку для хранения точности отводится только 7 цифр.

Также стоит отметить, что стандарт IEEE, который реализуется компиляторами С++, определяет специальные значения для чисел с плавающей точкой, в которых мантисса на бинарном уровне состоит только из нулей, а экспонента, которая состоит из одних единиц, в зависимости от знака представляет значения

+infinity (плюс бесконечность +∞) и -infinity (минус бесконечность -∞). И при делении положительного числа на ноль, результатом будет +infinity, а при делении отрицательного числа на ноль — -infinity.

Другое специальное значение с плавающей точкой, определенное этим стандартом, представляет значение NaN (не число). Это значение представляет результат операции, который не определяется математически, например, когда ноль делится на ноль или бесконечность на бесконечность. Результатом любой операции, в которой один или оба операнда являются

NaN, также является NaN.

Для демонстрации рассмотрим следующую программу:


#include <iostream>

int main()
{
    double a{ 1.5 }, b{}, c{}, d {-1.5};
    double result { a / b };
    std::cout << a << "/" << b << " = " << result << std::endl;
    result = d / c;
    std::cout << d << "/" << c << " = " << result << std::endl;
    result = b / c;
    std::cout << b << "/" << c << " = " << result << std::endl;
    std::cout << result << " + " << a << " = " << result + a << std::endl;
}

В выражении a / b число 1. 5 делится на 0, поэтому результатом будет плюс бесконечность.

Аналогично в выражении d / c число -1.5 делится на 0, поэтому результатом будет минус бесконечность.

В выражении b / c число 0 делится на 0, поэтому результатом будет NaN.

Соответственно последнее выражение result + a будет аналогично NaN + 0, соответственно результатом тоже будет NaN

Консольный вывод программы


1.5/0 = inf
-1.5/0 = -inf
0/0 = nan
nan + 1.5 = nan

Инкремент и декремент

Также есть две унарные арифметические операции, которые производятся над одним числом: ++ (инкремент) и — (декремент). Каждая из операций имеет две разновидности: префиксная и постфиксная:

  • Префиксный инкремент.

    Увеличивает значение переменной на единицу и полученный результат используется как значение выражения ++x

    
    #include <iostream>
    
    int main()
    {
        int a {8};
        int b {++a};
        std::cout << "a = " << a << std::endl;  // a = 9
        std::cout << "b = " << b << std::endl;  // b = 9
    }
    
  • Постфиксный инкремент.

    Увеличивает значение переменной на единицу, но значением выражения x++ будет то, которое было до увеличения на единицу

    
    #include <iostream>
    
    int main()
    {
        int a {8};
        int b {a++};
        std::cout << "a = " << a << std::endl;  // a = 9
        std::cout << "b = " << b << std::endl;  // b = 8
    }
    
  • Префиксный декремент.

    Уменьшает значение переменной на единицу, и полученное значение используется как значение выражения —x

    
    #include <iostream>
    
    int main()
    {
        int a {8};
        int b {--a};
        std::cout << "a = " << a << std::endl;  // a = 7
        std::cout << "b = " << b << std::endl;  // b = 7
    }
    
  • Постфиксный декремент.

    Уменьшает значение переменной на единицу, но значением выражения x— будет то, которое было до уменьшения на единицу

    
    #include <iostream>
    
    int main()
    {
        int a {8};
        int b {a--};
        std::cout << "a = " << a << std::endl;  // a = 7
        std::cout << "b = " << b << std::endl;  // b = 8
    }
    

Приоритет и ассоциативность операторов

Операторы могут быть левоассоциативными — такие операторы выполняются слева направо и правоассоциативными — выполняются справа налево. Подавляющее большинство операторов левоассоциативны (например, бинарные арифметические операции), поэтому большинство выражений оценивается слева направо. Правоассоциативными операторами являются все унарные операторы, различные операторы присваивания и условный оператор.

Кроме того, одни операции имеют больший приоритет, чем другие и поэтому выполняются вначале. Операции в порядке уменьшения приоритета:

+ (инкремент), — (декремент)
* (умножение), / (деление), % (остаток от деления)
+ (сложение), — (вычитание)

Приоритет операций следует учитывать при выполнении набора арифметических выражений:


int a = 8;
int b = 7;
int c = a + 5 * ++b;      // 48

Хотя операции выполняются слева направо, но вначале будет выполняться операция инкремента ++b, которая увеличит значение переменной b и возвратит его в качестве результата, так как эта операция имеет больший приоритет. Затем выполняется умножение 5 * ++b, и только в последнюю очередь выполняется сложение a + 5 * ++b

Следует учитывать, что если в одной инструкции для одной переменной сразу несколько раз вызываются операции инкремента и декремента, то результат может быть неопределенным, и много зависит от конкретного компилятора. Например:


int count {1};
int result = ++count * 3 + count++ * 5;

Так, и g++, и clang++ скомпилируют данный код, и результат переменной result будет таким, как в принципе и ожидается — 16, но компилятор clang++ также сгенерирует предупреждение.

Переопределение порядка операций

Скобки позволяют переопределить порядок вычислений. Например:


#include <iostream>

int main()
{
    int a {8};
    int b {7};
    int c {(a + 5) * ++b};      // c = 104
    std::cout << "c = " << c << std::endl;
}

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

НазадСодержаниеВперед

3.4 Основные арифметические операторы. Основы компьютерного программирования в Ruby [книга]

Теперь, когда некоторые классы, определяющие различные типы данных, были введены, что вы можете сделать с ними? Как и все остальное программирование языков, Ruby может выполнять множество математических операций. В Таблице 3-1 показано, как использовать Ruby в качестве Калькулятор.

Таблица 3-1. Основные арифметические операторы

Символ

Операция

Пример

+

Дополнение

х = 6 + 2

8

-

Вычитание

х = 3 - 2

1

*

Умножение

х = 5 * 2

10

/

Отдел

х = 16/8

2

%

Модуль

х = 5 % 3

2

**

Мощность

х = 2 ** 4

16

Все перечисленные операторы являются бинарными, т. е. оператор имеет два операнда. Например, команда A + B — это бинарная операция, где A и B — это два операнда и + является оператором.

При вводе математических операций в интерпретаторе Ruby учитывается порядок действий. Чтобы изменить порядок операции, используйте круглые скобки. Попробуйте ввести в команду следующее line:

 irb  (    main    ):    001    :    0    >     x     =     10     +     4     /     2   

Какой результат вы получили? Теперь попробуйте ввести следующее в подсказка:

 irb  (    main    ):    001    :    0    >     x     =     (    10     +     4    )     /     2  

Большинство операторов должны выглядеть знакомыми. Тот, который может не оператор модуля ( % ). Целью этого оператора является нахождение остатка от деления двух чисел. Например, 4 по модулю 2, сокращенно 4 по модулю 2, даст результат 0. Это потому, что 4/2 точно равно 2. С другой стороны, 2 по модулю 4 дает результат 2. Это потому, что 2/4 равно 0. , с остатком 2. Попробуем решить несколько простых задач, используя модуль …

Получите курс «Основы программирования в области информатики на Ruby » прямо сейчас с обучающей платформой O’Reilly.

члена O’Reilly знакомятся с книгами, живыми мероприятиями, курсами, подобранными в зависимости от должности, и многим другим от O’Reilly и почти 200 ведущих издателей.

Начать бесплатную пробную версию

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

Кеннет Лерой Басби и Дэйв Брауншвейг

Обзор

Основные арифметические операции — это сложение, вычитание, умножение и деление. Арифметика выполняется в соответствии с порядком операций. [1]

Обсуждение

Оператор выполняет действие над одним или несколькими операндами. Общие арифметические операторы:

Действие Общий символ
Дополнение +
Вычитание -
Умножение *
Отдел /
Модуль (связанный с целыми числами) %

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

возраст + 1

Это выражение состоит из одного оператора (сложения), который имеет два операнда. Первый представлен переменной с именем age, а второй — буквальной константой. Если бы возраст имел значение 14, то выражение оценивало бы (или было равно) 15.

Эти операторы работают так, как вы их выучили на протяжении всей жизни, за исключением деления и модуля. Обычно мы думаем о делении как о результате результата, который может иметь дробную часть (тип данных с плавающей запятой). Однако деление, когда оба операнда имеют целочисленный тип данных, может действовать по-разному. Пожалуйста, обратитесь к следующему разделу «Целочисленное деление и модуль».

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

Многие языки программирования поддерживают комбинацию присваивания ( = ) и арифметические операторы (+, , *, /, % ). В различных учебниках они называются «составными операторами присваивания» или «комбинированными операторами присваивания». Их использование можно объяснить с точки зрения оператора присваивания и арифметических операторов. В таблице мы будем использовать переменную age и можно предположить, что она имеет целочисленный тип данных.

Оставить комментарий

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

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