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

7.12.1Логические условные операторы

Если операнды && или || имеют тип bool или типы, в которых не определены применимые операторы operator & или operator |, но определены неявные преобразования в bool, то операция выполняется следующим образом.

  • The operation x && y is evaluated as x ? y : false. Другими словами, сначала вычисляется x и затем преобразуется в тип bool. Затем, если x равен true, y вычисляется и преобразуется в тип bool и становится результатом операции. Иначе результат операции равен false.

  • Операция x || y вычисляется как x ? true : y. Другими словами, сначала вычисляется x и затем преобразуется в тип bool. Затем, если x равно true, результат операции равен true. Иначе y вычисляется и преобразуется в тип bool и становится результатом операции.

7.12.2Пользовательские условные логические операторы

Если операнды && или || имеют типы, в которых объявляются применимые пользовательские операторы operator & или operator |, то должны выполняться оба следующих условия, где T является типом, в котором объявляется выбранный оператор.

  • Типом возвращаемого значения и типом каждого параметра выбранного оператора должен быть T. Другими словами, оператор должен вычислять операцию логического AND или логического OR для двух операндов типа T и должен возвращать результат типа T.

  • T должен содержать объявления operator true и operator false.

Если какое-либо из этих условий не выполняется, возникает ошибка времени привязки. Иначе операция && или || вычисляется путем объединения пользовательских операторов operator true и operator false с выбранным пользовательским оператором:

  • Операция x && y вычисляется как T.false(x) ? x : T.&(x, y), где T.false(x) является вызовом оператора operator false, объявленного в T, а T.&(x, y) является вызовом выбранного оператора &. Другими словами, сначала вычисляется x и для результата вызывается оператор operator false, чтобы определить, имеет ли x значение false. Затем, если x имеет значение false, результатом операции становится значение, ранее вычисленное для x. Иначе вычисляется y и выбранный оператор operator & вызывается для ранее вычисленного значения для x и вычисленного значения y, чтобы получить результат операции.

  • Операция x || y вычисляется как T.true(x) ? x : T.|(x, y), где T.true(x) является вызовом оператора operator true, объявленного в T, а T.|(x, y) является вызовом выбранного оператора |. Другими словами, сначала вычисляется x и для результата вызывается оператор operator true, чтобы определить, имеет ли x значение true. Затем, если x имеет значение true, результатом операции становится значение, ранее вычисленное для x. Иначе вычисляется y и выбранный оператор operator | вызывается для ранее вычисленного значения для x и вычисленного значения y, чтобы получить результат операции.

В обеих этих операциях выражение в x вычисляется только один раз, а выражение в y либо не вычисляется, либо вычисляется ровно один раз.

Пример типа, в котором реализуется оператор operator true и operator false, см. в разделе §11.4.2.

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