Вопрос по conditional-operator, logical-operators, c# – В чем разница между логическим и условным И, ИЛИ в C #? [Дубликат]

44

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

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

(x & y)
(x | y)

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

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

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

Ваш Ответ

3   ответа
11

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

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

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

По разделу14.10 из ECMA-334:

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

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

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

По разделу14,11:

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

14.11.1

1 Когда операнды && или || имеют тип bool, или когда операнды имеют типы, которые не определяют применимый оператор & или operator |, но определяют неявные преобразования в bool, операция обрабатывается следующим образом: 2 Операция x && y оценивается как x? у: ложь 3 Другими словами, x сначала оценивается и преобразуется в тип bool. 4 Затем, если x равно true, y вычисляется и преобразуется в тип bool, и это становится результатом операции. 5 В противном случае результат операции будет ложным. 6 Операция х || у оценивается как х? правда: у. 7 Другими словами, x сначала оценивается и преобразуется в тип bool. 8 Затем, если x равен true, результат операции равен true. 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) - вызов выбранного оператора &. 4 Другими словами, сначала вычисляется x, и в результате вызывается оператор false, чтобы определить, действительно ли x ложно. 5 Затем, если x определенно ложно, результатом операции является значение, ранее вычисленное для x. 6 В противном случае вычисляется y, и выбранный оператор & вызывается для значения, ранее вычисленного для x, и значения, вычисленного для y, для получения результата операции. 7 Операция х || у оценивается как 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 В любой из этих операций выражение, заданное x, вычисляется только один раз, а выражение, заданное y, либо не оценивается, либо вычисляется ровно один раз. Параграф 4 1 Пример типа, который реализует оператор true и оператор false, см. В §18.4.2.

@Мэтью; Согласитесь, это можно истолковать таким образом. John Weldon
&, |, а также^ перегружены. Для двух логических значений они просто нетерпеливые (безусловные) логические операторы (ECMA-364 §14.10.3) Matthew Flaschen
на самом деле я думаю, что я не согласен. Из второго примера ясно, что x и y являются логическими значениями. Побитовые операторы никогда не входят в вопрос. Matthew Flaschen
@ Мэтью, этот вопрос ставится более широко, чем то, что относится к логическим значениям. John Weldon
76

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

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.

@mallardz: спасибо за отзыв ... как насчет сейчас? Cogwheel
@ Роберт, @ 0xA3 - здесь я отказался от большинства своих мнений и аргументов ... подробности см. В моем ответе. John Weldon
@ 0xA3, концепция «короткого замыкания» специфична для логической операции. Это не относится к побитовым операциям, за исключением некоторых случаев. John Weldon
Небрежный ответ, потому что он не различает (достаточно) между булевыми и числовыми операндами. В C # нет побитовых операторов для логических значений. Henk Holterman
32
(x && y) 

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

(x & y)

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

Это только половина истории и, возможно, менее важная половина. Kennet Belenky
Да, но вопрос об операторах в целом не так, как они относятся кодин тип (bool) John Weldon
@ Джон: вот ссылка.steve-fair-dev.blogspot.com/2007/02/... Robert Harvey
Мех. Я думаю, я пойду, чтобы ответить на некоторые другие вопросы. Robert Harvey

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