Арифметические операторы в c: С | Арифметические операции

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

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

Арифметические операции производятся над числами. Значения, которые участвуют в операции, называются операндами. В языке программирования 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;	// 3
    int d = 41 - b;	// 34
    
  • *

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

    
    int a = 10;
    int b = 7;
    int c = a * b;	// 70
    int d = b * 5;	// 35
    
  • /

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

    
    int a = 20;
    int b = 5;
    int c = a / b;	// 4
    double d = 22. 5 / 4.5;	// 5
    

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

    
    double k = 10 / 4;     // 2
    std::cout << k;
    

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

    
    double k = 10.0 / 4;     // 2.5
    std::cout << k;
    
  • %

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

    
    int a = 33;
    int b = 5;
    int c = a % b;	// 3
    int d = 22 % 4;	// 2 (22 - 4*5 = 2)
    

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

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

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

    
    int a = 8;
    int b = ++a;
    std::cout << a << "\n";	// 9
    std::cout << b << "\n";	// 9
    
  • Постфиксный инкремент.

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

    
    int a = 8;
    int b = a++;
    std::cout << a << "\n";	// 9
    std::cout << b << "\n";	// 8
    
  • Префиксный декремент.

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

    
    int a = 8;
    int b = --a;
    std::cout << a << "\n";	// 7
    std::cout << b << "\n";	// 7
    
  • Постфиксный декремент.

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

    
    int a = 8;
    int b = a--;
    std::cout << a << "\n";	// 7
    std::cout << b << "\n";	// 8
    

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

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

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


int a = 8;
int b = 7;
int c = a + 5 * ++b;      // 48
std::cout << c;

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

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


int a = 8;
int b = 7;
int c = (a + 5) * ++b;      // 104
std::cout << c;

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

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

5.2 – Арифметические операторы

Добавлено 3 мая 2021 в 14:55

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

В C++ есть два унарных арифметических оператора, плюс (+) и минус (-). Напоминаем, что унарные операторы – это операторы, которые принимают только один операнд.

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

Оператор унарного минуса возвращает операнд, умноженный на -1. Другими словами, если x = 5, -x равно -5.

Оператор унарного плюса возвращает значение операнда. Другими словами, +5 равно 5, а +x равно x. Как правило, вам не нужно использовать этот оператор, поскольку он избыточен. Он был добавлен в основном для обеспечения симметрии с унарным оператором минус.

Для наилучшего эффекта оба этих оператора следует размещать непосредственно перед операндом (например, -x, а не - x).

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

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

В C++ есть 5 бинарных арифметических операторов. Бинарные операторы – это операторы, которые принимают левый и правый операнды.

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

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

Деление и остаток от деления требуют дополнительных пояснений. О делении мы поговорим ниже, а об остатке от деления – в следующем уроке.

Целочисленное деление и деление с плавающей запятой

Проще всего представить себе, что оператор деления имеет два разных «режима».

Если один (или оба) операнда являются значениями с плавающей точкой, оператор деления выполняет деление с плавающей точкой. Деление с плавающей точкой возвращает значение с плавающей точкой, и дробная часть сохраняется. Например, 7.0 / 4 = 1.75, 7 / 4.0 = 1.75 и 7.0 / 4.0 = 1.75. Как и во всех арифметических операциях с плавающей точкой, здесь могут возникать ошибки округления.

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

Предупреждение


До C++11 целочисленное деление с отрицательным операндом могло округляться в большую или меньшую сторону. Таким образом, -5 / 3 могло дать результат -1 или -2. Это было исправлено в C++11, где дробная часть всегда отбрасывается (округляется до 0).

Использование

static_cast<> для деления с плавающей точкой с целочисленными значениями

Сказанное выше поднимает вопрос: если у нас есть два целых числа и мы хотим разделить их без потери дробной части, как нам это сделать?

В уроке «4.11 – Символы» мы показали, как можно использовать оператор static_cast<> для преобразования значения char в целочисленный тип, чтобы оно печаталось как целое число, а не как символ.

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

#include <iostream>
 
int main()
{
    int x{ 7 };
    int y{ 4 };
 
    std::cout << "int / int = " << x / y << '\n';
    std::cout << "double / int = " << static_cast<double>(x) / y << '\n';
    std::cout << "int / double = " << x / static_cast<double>(y) << '\n';
    std::cout << "double / double = " << static_cast<double>(x) / static_cast<double>(y) << '\n';
 
    return 0;
}

Эта программа дает следующий результат:

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

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

Деление на ноль

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

#include <iostream>
 
int main()
{
	std::cout << "Enter a divisor: ";
	int x{};
	std::cin >> x;
 
	std::cout << "12 / " << x << " = " << 12 / x << '\n';
 
	return 0;
}

Если вы запустите показанную выше программу и введете 0, ваша программа завершится со сбоем. Попробуйте, это не повредит вашему компьютеру.

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

Арифметические операторы присваивания
ОператорОбозначениеПример использованияОперация
Присваивание=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

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

х = х + 4; // добавляем 4 к существующему значению x

Это работает, но немного неудобно и требует для выполнения двух операторов (operator+ и operator=).

Поскольку написание таких инструкций, как x = x + 4, очень распространено, C++ для удобства предоставляет пять арифметических операторов присваивания. Вместо того, чтобы писать x = x + 4, вы можете написать x += 4. Вместо x = x * y вы можете написать x *= y.

Таким образом, приведенную выше строку можно переписать так:

х += 4; // добавляем 4 к существующему значению x

Оригинал статьи:

  • 5.2 — Arithmetic operators

Теги

C++ / CppLearnCppstatic_castДля начинающихОбучениеОператор (программирование)Оператор присваиванияПрограммированиеЦелочисленное деление

Назад

Оглавление

Вперед

арифметических выражений и приоритет операторов в C | Учебники по программированию на C

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

В C поддерживаются следующие арифметические операторы: +, -, *, / и % . Операнды включают целые числа и числа с плавающей запятой. Некоторые алгебраические выражения и соответствующие им выражения C приведены в следующей таблице.

  Алгебраическое выражение   Выражение C

   

 (а + б) * (а–б)

   

 (а * б) / с

   

2 * х * х + 3 * х

Арифметические выражения оцениваются с помощью оператора присваивания вида переменная = выражение

. Выражение вычисляется первым, и значение присваивается переменной. Пример оператора оценки: c = a - b / d + e

Приоритет арифметических операторов в C

Чтобы однозначно определить значение и значение выражения, мы применяем правила приоритета и ассоциативности операторов. Арифметические выражения без круглых скобок оцениваются слева направо с использованием правил приоритета операторов. В C арифметические операторы имеют два разных уровня приоритета.

  • Высокий приоритет * / %
  • Низкий приоритет + -

Базовая процедура вычисления выражения включает два прохода слева направо. Операторы с высоким приоритетом применяются во время первого прохода, а операторы с низким приоритетом применяются во время второго прохода.

Например, оператор x = 8 – 15 / 5 + 2 * 5 – 7 оценивается следующим образом:

  • Первый проход
    • x = 8 - 5 + 2 * 5 -7
    • 1 1 x = 8 - 5 + 10 - 7
  • Второй проход
    • x = 3 + 10 - 7
    • x = 13 - 7
    • x = 6
  • 90 Эти шаги показаны на следующем рисунке.

    Однако можно использовать круглые скобки для изменения порядка вычисления выражения. Выражение в скобках имеет наивысший приоритет. Следующие правила используются для вычисления выражений, содержащих скобки.

    • Подвыражения в скобках оцениваются слева направо.
    • При наличии вложенных скобок оценка начинается с самого внутреннего подвыражения.
    • Порядок применения операторов при вычислении подвыражений определяется с помощью правила приоритета.
    • Если в подвыражении присутствуют два или более оператора с одинаковым уровнем приоритета, применяется правило ассоциативности.
    • Арифметические выражения оцениваются слева направо с использованием правил старшинства.
    • Выражения в круглых скобках имеют наивысший приоритет.

    Например, оператор x = 8 – 14 / (5 + 2) * (8 – 7) вычисляется следующим образом:

    • Первый проход
      • x = 8 – 14 / 7 * (8 -7)
      • x = 8 - 14 / 7 * 1
    • Second pass
      • x = 8 - 2 * 1
      • x = 8 - 2
    • Третий проход
      • x = 6

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

    В следующей таблице показан полный список операторов C, их уровни приоритета и правила их ассоциации.

    9
    Оператор Описание Ассоциативность Ранг
    () Вызов функции Слева направо 1
    [] Ссылка на элемент массива
    + Унарный плюс Справа налево 2
    Унарный минус
    ++ Приращение
    Уменьшение
    ! Логическое отрицание
    ~ Единицы дополняют
    * Справочник указателя
    и Адрес
    размер Размер объекта
    (тип) Тип литой (переделка)
    * Умножение Слева направо 3
    / Подразделение
    % Модуль
    + Дополнение Слева направо 4
    Вычитание
    << Сдвиг влево Слева направо 5
    >> Правый сдвиг
    < Менее Слева направо 6
    <= Меньше или равно
    > Больше
    >= Больше или равно
    == Равенство Слева направо 7
    Побитовое исключающее ИЛИ Слева направо 9
    | Побитовое ИЛИ Слева направо 10
    && Логическое И Слева направо 11
    || Логическое ИЛИ Слева направо 12
    ?: Условный оператор Справа налево 13
    = Оператор присвоения Справа налево 14
    , Оператор запятой Слева направо 15

    5.

    2 — Арифметические операторы — Learn C++

    Alex

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

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

    Operator Symbol Form Operation
    Unary plus + +x Value of x
    Unary minus - -x Negation of x

    Унарный минус возвращает операнд, умноженный на -1. Другими словами, если x = 5, -x равно -5.

    Унарный оператор плюс возвращает значение операнда. Другими словами, +5 равно 5, а +x равно x. Как правило, вам не нужно использовать этот оператор, поскольку он избыточен. Он был добавлен в основном для обеспечения симметрии с унарный минус оператор.

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

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

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

    Существует 5 двоичных арифметических операторов. Бинарные операторы — это операторы, которые принимают левый и правый операнд.

    Operator Symbol Form Operation
    Addition + x + y x plus y
    Subtraction - x - y x minus у
    Умножение * x * y x multiplied by y
    Division / x / y x divided by y
    Modulus (Remainder) % x % y Остаток от деления x на y

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

    Деление и модуль (остаток) требуют дополнительного пояснения. О делении мы поговорим ниже, а о модуле — на следующем уроке.

    Целочисленное деление и деление с плавающей запятой

    Проще всего представить, что оператор деления имеет два разных «режима».

    Если один (или оба) из операндов являются значениями с плавающей запятой, оператор деления выполняет деление с плавающей запятой. Деление с плавающей запятой возвращает значение с плавающей запятой, а дробь сохраняется. Например, 7,0 / 4 = 1,75 , 7 / 4,0 = 1,75 и 7,0 / 4,0 = 1,75 . Как и во всех арифметических операциях с плавающей запятой, могут возникать ошибки округления.

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

    Использование static_cast для деления целых чисел с плавающей запятой

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

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

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

     #include 
    основной ()
    {
        интервал х{ 7 };
        интервал у { 4 };
        std::cout << "int / int = " << x / y << '\n';
        std::cout << "double / int = " << static_cast(x) / y << '\n';
        std::cout << "int / double = " << x / static_cast(y) << '\n';
        std::cout << "double / double = " << static_cast(x) / static_cast(y) << '\n';
        вернуть 0;
    } 

    Результат:

     int / int = 1
    двойной / интервал = 1,75
    инт / двойной = 1,75
    двойной / двойной = 1,75
     

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

    Деление на 0 и 0.0

    Попытка разделить на целое число 0 приведет к неопределенному поведению, так как результаты математически не определены!

     #include 
    основной ()
    {
    std::cout << "Введите делитель: ";
    интервал х{};
    std::cin >> х;
    std::cout << "12 / " << x << " = " << 12 / x << '\n';
    вернуть 0;
    } 

    Если вы запустите указанную выше программу и введете 0 , ваша программа, скорее всего, выйдет из строя. Идите и попробуйте, это не повредит вашему компьютеру.

    Результат деления на значение с плавающей запятой 0.0 определяется реализацией (это означает, что поведение определяется компилятором/архитектурой). В архитектурах, поддерживающих формат с плавающей запятой IEEE754, результатом будет NaN или Inf. На других архитектурах результатом, вероятно, будет неопределенное поведение.

    Вы можете увидеть, что показывает ваш компилятор, запустив следующую программу и введя 0.0 :

     #include 
    основной ()
    {
    std::cout << "Введите делитель: ";
    двойной х {};
    std::cin >> х;
    std::cout << "12 / " << x << " = " << 12 / x << '\n';
    вернуть 0;
    } 

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

    Оператор Символ Форма Операция
    ВСЕГДА =.
    Оставить комментарий

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

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

    © 2019 Штирлиц Сеть печатных салонов в Перми

    Цифровая печать, цветное и черно-белое копирование документов, сканирование документов, ризография в Перми.