Каково различие между логическим и условным И, ИЛИ в C#? [дубликат]

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

Логичный И и ИЛИ:

(x & y)
(x | y)

Условное выражение И и ИЛИ:

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

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

47
задан Community 23 May 2017 в 10:31
поделиться

3 ответа

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

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()

This вызовет y.bar() только если x.foo() оценивается как true. И наоборот,

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

вызовет y.bar(), только если x.foo() оценивается как false.

77
ответ дан 26 November 2019 в 19:22
поделиться
(x && y) 

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

(x & y)

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

34
ответ дан 26 November 2019 в 19:22
поделиться

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

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

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

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

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

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

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

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

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

14.11.1

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

14.11.2

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

11
ответ дан 26 November 2019 в 19:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: