2010-06-30 2 views
37

Можно создать дубликат:
What is the diffference between the | and || or operators?В чем разница между логическим и условным И, ИЛИ в C#?

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

(x & y) 
(x | y) 

Условный И и ИЛИ:

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

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

ответ

64

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

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 

Редактировать

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

Например:

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

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

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

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

+10

OK. Что относительно ленивой оценки? Вы собираетесь это упомянуть? Потому что, если вы это сделаете, я могу удалить свой самый непопулярный ответ. –

+0

Ленивая оценка - это подмножество логических операций. Следует упомянуть, но это не имеет отношения к вопросу. –

+0

@John Weldon: Вопрос о различиях между операторами. И лень - один из них. –

31
(x && y) 

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

(x & y) 

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

+1

Это неверно, я верю? Можете ли вы привести? (Я согласен с первым утверждением, но не вторым) –

+14

Это только половина истории, и, возможно, менее важная половина. –

+1

Уверен, но есть еще что-то, кроме этого, нет? Предположим, что x и y не являются булевыми? Без упоминания поразрядной природы | и &, этот ответ лишен чего-то. – spender

11

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

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

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

Согласно разделу 14.10 of ECMA-334:

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

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

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

В соответствии с разделом 14.11:

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

14.11.1

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

14.11.2

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

+4

'&', '|' и '^' перегружены. Для двух булевых элементов это просто нетерпеливые (не условные) логические операторы (ECMA-364 §14.10.3) –

+0

@Matthew, этот вопрос задается более широко, чем относится к булевым. –

+0

На самом деле я думаю, что не согласен. Из второго примера видно, что x и y являются булевыми. Побитовые операторы никогда не вступают в вопрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^