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

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

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

bool operator !(bool x);

Этот оператор вычисляет логическое отрицание операнда. Если операнд равен true, то результат равен false. Если операнд равен false, то результат равен true.

7.7.4Оператор побитового дополнения

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

int operator ~(int x); uint operator ~(uint x); long operator ~(long x); ulong operator ~(ulong x);

Для каждого из этих операторов результатов операции является побитовое дополнение x.

Каждый тип перечисления E неявно предоставляет следующий оператор побитового дополнения:

E operator ~(E x);

Результат вычисления ~x, где x является выражением типа перечисления E с базовым типом U, в точности совпадает с результатом вычисления (E)(~(U)x).

7.7.5Префиксные операторы инкремента и декремента

выражение_до_инкремента: ++ унарное_выражение

выражение_до_декремента: -- унарное_выражение

Операнд префиксного оператора инкремента или декремента должен быть выражением, которое классифицируется как переменная, доступ к свойству или доступ к индексатору. Результатом операции является значение того же типа, что и операнд.

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

Для выбора конкретной реализации оператора используется разрешение перегрузки унарных операторов (§7.3.3). Стандартные операторы ++ и -- применимы к следующим типам: sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal и любым типам перечисления. Стандартный оператор ++ возвращает значение, полученное добавлением 1 к операнду, а стандартный оператор -- возвращает значение, полученное вычитанием 1 из операнда. В контексте checked если результат такого сложения или вычитания выходит за пределы допустимого диапазона для типа результата и результат имеет целый тип или тип перечисления, то возникает исключение System.OverflowException.

Во время выполнения обработка префиксных операций инкремента или декремента в виде ++x или --x включает следующие этапы.

  • Если x классифицируется как переменная, то:

  • x вычисляется для создания переменной.

  • Вызывается выбранный оператор со значением x в качестве аргумента.

  • Значение, возвращенное оператором, сохраняется в расположении, предоставленном при вычислении x.

  • Значение, возвращенное оператором, становится результатом операции.

  • Если x классифицируется как свойство или доступ к индексатору, то:

  • Вычисляются выражение экземпляра (если x не имеет тип static) и список аргументов (если x является доступом к экземпляру), связанные с x, и полученные результаты используются при последующих вызовах методов доступа get и set.

  • Вызывается метод доступа get для x.

  • Вызывается выбранный оператор со значением аргумента, равным возвращенному значению метода доступа get.

  • Вызывается метод доступа set для x со значением, возвращенным оператором в качестве своего аргумента value.

  • Значение, возвращенное оператором, становится результатом операции.

Операторы ++ и -- также могут использоваться в постпозиции (§7.6.9). Обычно результатом операторов x++ и x-- является значение x до операции, тогда как результатом ++x и --x является значение x после операции. В обоих случаях сама переменная x имеет одинаковое значение после операции.

Реализацию оператора ++ или -- можно вызывать в префиксной и постфиксной форме. Для двух этих форм нельзя создать разные реализации операторов.

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