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

В следующих разделах приведена краткая сводка математических операций, выполняемых в C#. Вещественные типы подчиняются очень жестким правилам[1]; за более полными сведениями обращайтесь к спецификации CLR. Выполнение в проверяемом контексте математических выражений для невещественных типов может привести к инициированию исключений.

Унарный плюс

Результат операции, реализуемой оператором унарного плюса, просто равен значению операнда.

Унарный минус

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

Сложение

В C# знак + используется как для сложения чисел, так и для конкатенации строк.

Числовое сложение

Значения двух операндов суммируются. Если выражение вычисляется в проверяемом контексте и сумма нарушает границы типа результата, инициируется исключение OverflowException. Числовое сложение продемонстрировано в следующем примере:

using System;

class Test

{

public static void Main()

{

byte val1 = 200;

byte val2 = 201;

byte sum = (byte) (val1 + val2); // Исключения нет

checked

{

byte sum2 = (byte) (val1 + val2); // Исключение

}

}

}

Конкатенация строк

Операция конкатенации может выполняться с двумя строками или между строкой и операндом типа object[2]. Если какой-либо из операндов равен null, вместо него подставляется пустая строка.

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

Вычитание

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

Умножение

Оператор (*) вычисляет произведение двух операндов. Если выражение вычисляется в проверяемом контексте и произведение нарушает границы типа результата, инициируется исключение OverflowException.

Деление

Первый операнд делится на второй операнд. Если второй операнд равен нулю, инициируется исключение DivideByZero.

Вычисление остатка

Результат x % y вычисляется по формуле x - (x / y) * y. Если значение y равно нулю, инициируется исключение DivideByZero.

Сдвиг

При сдвиге влево (<<) старшие биты отбрасываются, а младшие биты заполняются нулями.

При сдвиге вправо (>>) в типах uint и ulong младшие биты отбрасываются, а старшие биты заполняются нулями.

При сдвиге вправо в типах int и long младшие биты отбрасываются, а старшие биты заполняются нулями (для неотрицательных значений x) или единицами (для положительных значений x).

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

Оператор ++ увеличивает значение переменной на 1, а оператор -- уменьшает значение переменной на 1[3].

Операторы ++ и -- могут использоваться в префиксной форме (когда значение переменной модифицируется до ее чтения) или в постфиксной форме (когда значение переменной возвращается до ее модификации).

Например:

int k = 5;

int value = k++; // value = 5

value = --k; // value = 5

value = ++k; // value = 6


[1] Они соответствуют стандарту IEEE 754.

[2] То есть операндом произвольного типа, поскольку любой тип может быть преобразован к object.

[3] В программном коде unsafe при использовании инкремента и декремента по отношению к указателям приращение равно размеру объекта, на который ссылается указатель.

Предлагаю ознакомиться с аналогичными статьями: