Математические операторы C#

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

Подпишись на группу Вконтакте и Телеграм-канал. Там еще больше полезного контента для программистов.
А на YouTube-канале ты найдешь обучающие видео по программированию. Подписывайся!

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

Основными математическими операторами в языке программирования C# являются:

  • Сложение (+)
  • Вычитание (-)
  • Умножение (*)
  • Деление (/)
  • Остаток от деления (%)

Рассмотрим пример простейшего приложения:

using System;
using System.Text;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Настройка кодировки, если используется Английская версия Windows.
            Console.OutputEncoding = Encoding.Unicode;

            // Запрашиваем у пользователя входные данные.
            var first = InputNumber();
            var second = InputNumber();

            // Сумма.
            var sum = first + second;
            Console.WriteLine($"Результат сложения {first} и {second} равен {sum}.");

            // Разность.
            var sub = first - second;
            Console.WriteLine($"Результат вычитания {first} и {second} равен {sub}.");

            // Умножение.
            var mul = first * second;
            Console.WriteLine($"Результат умножения {first} и {second} равен {mul}.");

            // Деление на цело.
            var dev = first / second;
            Console.WriteLine($"Результат деления на цело {first} и {second} равен {dev}.");

            // Дробное деление.
            var devd = (double)first / second;
            Console.WriteLine($"Результат деления дробного {first} и {second} равен {devd}.");

            // Остаток от деления.
            var mod = first % second;
            Console.WriteLine($"Результат остатка от деления {first} и {second} равен {mod}.");

            // Ожидаем ввода пользователя.
            Console.ReadLine();
        }

        /// <summary>
        /// Запросить у пользователя на ввод целое число.
        /// </summary>
        /// <returns> Целое число, введенное пользователем. </returns>
        private static int InputNumber()
        {
            // Повторяем запрос до тех пор, пока пользователь ни введет корректные данные.
            while (true)
            {
                // Делаем запрос на консоль и сохраняем введенные пользователем данные в текстовом формате.
                Console.Write("Введите число: ");
                var input = Console.ReadLine();

                // Пробуем преобразовать введенные пользователь данные в целое число.
                if (int.TryParse(input, out int inputNumber))
                {
                    // Если преобразование удалось, то возвращаем результат.
                    return inputNumber;
                }

                // Иначе сообщаем пользователю об ошибке.
                Console.WriteLine("Некорректный ввод. Пожалуйста, введите целое число.");
            }
        }
    }
}

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

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

Так же стоит упомянуть операцию остатка от деления, про которую многие забывают. В других языках она часто записывается как mod. Она означает, что результатом будет число, оставшееся неподеленным при целочисленном делении. Для примера 5 % 2 = 1, это означает, что было выполнено целочисленное деление ближайшего меньшего подходящего числа — 4. А результатом является разница этого числа и исходного 5 — 4 = 1.

Операторы инкремента

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

  • Увеличение значения переменной на 1 (++)
  • Уменьшение значения на 1 (—)
  • Увеличение значения переменной на заданное значение (+=)
  • Уменьшение переменной на заданное значение (-=)
  • Умножение переменной на значение (*=)
  • Деление переменной на значение (/=)

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

int i = 20;

i = i + 1;
i += 1;
i++;

Или другой пример, когда если мы хотим умножить текущее значение переменной на 4, то это можно записать так:

var j = 7;
j *= 4;
Console.WriteLine(j);

Префиксная и постфиксная запись инкремента

Обратите внимание, что существуют две формы записи:

  • Префиксная — когда оператор инкремента ставится перед именем переменной (++i)
  • Постфиксная — когда оператор инкремента ставится после имени переменной (i++)

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

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = 0;
            int m = 0;

            int i = 0;
            int j = 0;

            n = i++;
            m = ++j;
            Console.WriteLine($"n = {n}");
            Console.WriteLine($"m = {m}");
            Console.WriteLine($"i = {i}");
            Console.WriteLine($"j = {j}");
            Console.ReadLine();
        }
    }
}

Как вы видите, результат переменных n и m отличаются. Это связано с тем, что при постфиксной записи сначала выполнилось присвоение значения переменной i (0) в переменную n (0), а после этого было выполнено увеличение значение переменной i на единицу (1). При префиксной записи, сначала выполнилось увеличение значения переменной j (1), а после этого присвоение переменной m (1).

Сложение (конкатенация) строк

Если со сложением чисел все достаточно просто, то как будет вести себя язык C# при попытке сложения, вычитания, умножения и деления строк? На самом деле все достаточно просто, для строк доступна только одна операция это сложение, а если быть точнее конкатенация. Конкатенация — это операция склеивания двух строк в одну новую стоку, содержащую обе исходные подстроки. Рассмотрим пример:

string str1 = "Hello";
string str2 = "World";
string strresult = str1 + " " + str2;
Console.WriteLine(strresult);
Console.ReadLine();

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

Приоритет выполнения операторов

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

int i = 2 + 2 * 2;
int j = (2 + 2) * 2;

Console.WriteLine($"i = {i}");
Console.WriteLine($"j = {j}");
Console.ReadLine();

Математические операторы C# — Заключение

Применение математических операций в C# обычно не вызывает никаких сложностей у большинства людей, успешно закончивших начальный школьный курс математики и алгебры. Поэтому данных вопрос не требует очень подробного объяснения, за исключением некоторых деталей, рассказанных в этой статье.

Кроме того, рекомендую прочитать статью Установка .NET Framework 3.5. Исправление ошибок 0x800F081F и 0x800F0906. А также подписывайтесь на группу ВКонтакте, Telegram и YouTube-канал. Там еще больше полезного и интересного для программистов.