Подтвердить что ты не робот

В чем разница между логическим и условным И, ИЛИ в С#?

Возможный дубликат:
В чем разница между | и || или операторов?

Логические И и ИЛИ:

(x & y)
(x | y)

Условные AND и OR:

(x && y)
(x || y)

Я знаю только об условных операндах до этого момента. Я знаю, что он делает и как применять его в if-statement. Но какова цель логических операндов?

4b9b3361

Ответ 1

Я предпочитаю думать об этом как "побитовое или условное", а не "логическое или условное", поскольку в обоих случаях применяется общее понятие "логическое".

x & y    // bitwise AND, 0101 & 0011 = 0001
x | y    // bitwise OR,  0101 | 0011 = 0111

x && y   // true if both x and y are true
x || y   // true if either x or y are true

Edit

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

Например:

x.foo() && y.bar()

Это вызовет только y.bar(), если x.foo() оценивается как true. С другой стороны,

x.foo() || y.bar()

будет вызывать только y.bar(), если x.foo() имеет значение false.

Ответ 2

(x && y) 

ленив. Он будет оценивать только y, если x истинно.

(x & y)

не ленив. y всегда будет оцениваться.

Ответ 3

Обновленный ответ - мой оригинал был вводящим в заблуждение и неполным.

Сначала я должен извиниться за большую часть своих комментариев и ответов на этот вопрос.

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

В соответствии с разделом 14.10 ECMA-334:

The &, ^, и | операторы называются логические операторы.

для целых операций:

1 Оператор и вычисляет поразрядный логический И из двух операндов, | оператор вычисляет побитовое логическое ИЛИ двух операндов, а ^ оператор вычисляет побитовое логическое исключительный ИЛИ двух операндов. 2 Нет переполнения возможны из этих операции.

Согласно разделу 14.11:

& & и || операторы называются условные логические операторы. 2 Они также называются "короткозамкнутыми", логических операторов.

14.11.1

1 Когда операнды && или || являются из тип bool или когда операнды типы, которые не определяют применимые оператора и/или оператора |, но определить неявные преобразования в bool, операция обрабатывается следующим образом: 2 Операция x && y оценивается как Икс? y: false. 3 Другими словами, x является сначала оценивается и преобразуется в тип BOOL. 4 Тогда, если x истинно, y равно оценивается и преобразуется в тип bool, и это становится результатом операция. 5 В противном случае результат операция ложна. 6 операция x || y оценивается как x? true: y. Другими словами, x является первым оценивается и преобразуется в тип bool. 8 Тогда, если x истинно, результат операция верна. 9 В противном случае y оценивается и преобразуется в тип bool, и это становится результатом операции.

14.11.2

1 Когда операнды && или || являются из типы, которые объявляют применимыми определяемый пользователем оператор и/или оператор |, оба из них должны быть истинными, где T - тип, в котором выбранного оператора: 2 тип возврата и тип каждого параметр выбранного оператора должен быть T. 3 Иными словами, оператор должен вычислить логическое И или логический ИЛИ двух операндов тип T, и должен вернуть результат тип T. 4 T должен содержать декларации оператора true и оператора false. Пункт 2 1 Ошибка времени компиляции возникает, если любое из этих требований не выполняется. 2 В противном случае, & & или || операция оценивается по объединение пользовательского оператора true или оператор false с выбранный пользовательский оператор: 3 операция x && y оценивается как T.false(x)? x: T. & (x, y), где T.false(x) является вызовом оператор false, объявленный в T, и T. & (x, y) является вызовом выбранный оператор &. Другими словами, x сначала оценивается, а оператор false вызывается на результат определить, является ли x определенно ложным. 5 Тогда, если x определенно ложно, результатом операции является значение ранее вычисленный для x. 6 В противном случае y оценивается, а выбранного оператора и вызывается на значение, ранее вычисленное для x и значение, вычисленное для y для получения результат операции. 7 операция x || y оценивается как T.true(x)? x: T. | (x, y), где T.true(x) является вызовом оператор true, объявленный в T, и T. | (x, y) является вызовом выбранный оператор |. Другими словами, x сначала оценивается, а оператор true на результат вызывается если х определенно верно. 9 Тогда, если x определенно верно, результат операция - это значение ранее вычисляется для x. 10 В противном случае y оцененный и выбранный оператор | вызывается на значение ранее вычисляется для x и вычисляется значение для y для получения результата операция. Пункт 3 1 В любом из эти операции, данное выражение по x оценивается только один раз, а выражение, заданное y, либо не является оценивается или оценивается ровно один раз. Пункт 4 1 Пример типа который реализует оператор true и оператор false, см. §18.4.2.