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

7.11.1Логические операторы для целых чисел

К стандартным логическим операторам для целых чисел относятся:

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

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

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

Оператор & выполняет логическую побитовую операцию AND для двух операндов, оператор | выполняет логическую побитовую операцию OR для двух операндов, а оператор ^ выполняет логическую побитовую операцию исключающего OR для двух операндов. Эти операции не порождают переполнения.

7.11.2Логические операторы для перечислений

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

E operator &(E x, E y); E operator |(E x, E y); E operator ^(E x, E y);

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

7.11.3Логические операторы

К стандартным логическим операторам относятся:

bool operator &(bool x, bool y);

bool operator |(bool x, bool y);

bool operator ^(bool x, bool y);

Результат x & y равен true, если оба операнда x и y равны true. Иначе результат равен false.

Результат x | y равен true, если хотя бы один операнд x или y равен true. Иначе результат равен false.

Результат x ^ y равен true, если x равен true, а y равен false, либо если x равен false, а y равен true. Иначе результат равен false. Когда операнды имеют тип bool, оператор ^ дает такой же результат, как и оператор !=.

7.11.4Обнуляемые логические операторы

Обнуляемый логический тип bool? может представлять три значения: true, false и null, и, по сути, аналогичен типу из трех значений, используемому в логических выражениях в SQL. Чтобы обеспечить согласованность результатов операторов & и | с операндами типа bool? с троичной логикой SQL, предоставляются следующие стандартные операторы:

bool? operator &(bool? x, bool? y);

bool? operator |(bool? x, bool? y);

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

x

y

x & y

x | y

true

true

true

true

true

false

false

true

true

null

null

true

false

true

false

true

false

false

false

false

false

null

false

null

null

true

null

true

null

false

false

null

null

null

null

null

7.12Условные логические операторы

Операторы && и || называются условными логическими операторами. Они также называются логическими операторами «краткой записи».

выражение_условного_И: выражение_включающего_ИЛИ выражение_условного_И && выражение_включающего_ИЛИ

выражение_условного_ИЛИ: выражение_условного_И выражение_условного_ИЛИ || выражение_условного_И

Операторы && и || являются условными версиями операторов & и |.

  • Операция x && y соответствует операции x & y, за исключением того, что y вычисляется, только если x не равен false.

  • Операция x || y соответствует операции x | y, за исключением того, что y вычисляется, только если x не равен true.

Если операнд условного логического оператора имеет динамический тип во время компиляции, то он динамически связан (§7.2.2). В этом случае тип времени компиляции выражения динамический, а разрешение, приведенное ниже, будет иметь место во время выполнения при использовании типа времени выполнения тех операндов, которые имеют динамический тип во время компиляции.

Операция вида x && y или x || y обрабатывается с применением разрешения перегрузки (§7.3.4), как если бы операция записывалась в виде x & y или x | y. Тогда

  • Если при разрешении перегрузки не удается найти один наилучший оператор или выбирается один из стандартных логических операторов для целых чисел, то возникает ошибка времени привязки.

  • Иначе, если выбранный оператор является одним из стандартных логических операторов (§7.11.3) или обнуляемых логических операторов (§7.11.4), то операция выполняется, как описано в разделе §7.12.1.

  • Иначе выбранный оператор является пользовательским оператором, и операция выполняется, как описано в разделе §7.12.2.

Напрямую перегружать условные логические операторы нельзя. Однако поскольку условные логические операторы обрабатываются через обычные логические операторы, перегрузки обычных логических операторов с определенными ограничениями также считаются перегрузками условных логических операторов. Это описывается дальше в разделе §7.12.2.

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