Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

7.8.5Оператор вычитания

Для операции вида x – y, чтобы выбрать конкретную реализацию оператора, применяется разрешение перегрузки бинарного оператора (§7.3.4). Операнды преобразуются в типы параметров выбранного оператора, а тип результата является типом возвращаемого значения этого оператора.

Ниже перечислены стандартные операторы вычитания. Все операторы выполняют вычитание y из x.

  • Вычитание целых чисел:

int operator – (int x, int y); uint operator – (uint x, uint y); long operator – (long x, long y); ulong operator – (ulong x, ulong y);

В контексте checked если разность выходит за пределы диапазона типа результирующего значения, возникает исключение System.OverflowException. В контексте unchecked о переполнениях не сообщается, и все старшие биты, выходящие за пределы диапазона результирующего значения, отбрасываются.

  • Вычитание чисел с плавающей запятой:

float operator –(float x, float y); double operator –(double x, double y);

Разность вычисляется в соответствии с арифметическими правилами стандарта IEEE 754. В следующей таблице приведены результаты всех возможных комбинаций ненулевых конечных значений, нулей, бесконечных значений и ошибок NaN В таблице x и y являются ненулевыми конечными значениями, а z является результатом x - y. Если x и y равны, z равно положительному нулю. Если результат x - y слишком велик для представления в целевом типе, то z является бесконечным значением с таким же знаком, как и у x - y.

y

+0

–0

+∞

–∞

NaN

x

z

x

x

–∞

+∞

NaN

+0

–y

+0

+0

–∞

+∞

NaN

–0

–y

–0

+0

–∞

+∞

NaN

+∞

+∞

+∞

+∞

NaN

+∞

NaN

–∞

–∞

–∞

–∞

–∞

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

  • Вычитание десятичных чисел.

decimal operator –(decimal x, decimal y);

Если результирующее значение слишком велико для представления в формате decimal, то возникает исключение System.OverflowException. Масштаб результата до округления равен большему из масштабов двух операндов.

Вычитание десятичных чисел эквивалентно использованию оператора вычитания типа System.Decimal.

  • Вычитание элементов перечисления. В каждом типе перечисления неявно предоставляется следующий стандартный оператор, где E является типом перечисления, а U является базовым типом E:

U operator –(E x, E y);

Этот оператор вычисляется в точности как (U)((U)x – (U)y). Другими словами, оператор вычисляет разность между порядковыми значениями x и y, а типом результата является базовый тип перечисления.

E operator –(E x, U y);

Этот оператор вычисляется в точности как (E)((U)x – y). Другими словами, оператор вычитает значение из базового типа перечисления, выдавая значение перечисления.

  • Удаление делегатов. В каждом типе делегата неявно предоставляется следующий стандартный оператор, где D имеет тип делегата:

D operator –(D x, D y);

Бинарный оператор - выполняет удаление делегатов, когда оба операнда имеют некоторый тип делегата D. Если операнды имеют разные типы делегатов, возникает ошибка времени привязки. Если первый операнд равен null, то результатом операции является null. Иначе, если второй операнд равен null, то результатом операции является значение первого операнда. Иначе оба операнда представляют списки вызова (§15.1) с одной или несколькими записями, а результатом является новый список вызова, состоящий из списка первого операнда, из которого удалены записи второго операнда, при условии что список второго операнда является соответствующим смежным подсписком списка первого операнда. (Для определения равенства подсписков выполняется сравнение соответствующих записей, как и для оператора равенства делегатов (§7.10.8).) Иначе результатом является значение левого операнда. В ходе этого процессе списки операндов не меняются. Если список второго операнда соответствует нескольким подспискам последовательных записей в списке первого операнда, то самый правый совпадающий подсписок последовательных записей удаляется. Если после удаления получается пустой список, то результатом является null. Например:

delegate void D(int x);

class C { public static void M1(int i) { /* … */ } public static void M2(int i) { /* … */ } }

class Test { static void Main() { D cd1 = new D(C.M1); D cd2 = new D(C.M2); D cd3 = cd1 + cd2 + cd2 + cd1; // M1 + M2 + M2 + M1 cd3 -= cd1; // => M1 + M2 + M2

cd3 = cd1 + cd2 + cd2 + cd1; // M1 + M2 + M2 + M1 cd3 -= cd1 + cd2; // => M2 + M1

cd3 = cd1 + cd2 + cd2 + cd1; // M1 + M2 + M2 + M1 cd3 -= cd2 + cd2; // => M1 + M1

cd3 = cd1 + cd2 + cd2 + cd1; // M1 + M2 + M2 + M1 cd3 -= cd2 + cd1; // => M1 + M2

cd3 = cd1 + cd2 + cd2 + cd1; // M1 + M2 + M2 + M1 cd3 -= cd1 + cd1; // => M1 + M2 + M2 + M1 } }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]