Возможный дубликат:
Каково различие между | и || или операторы?Логичный И и ИЛИ:
(x & y) (x | y)
Условное выражение И и ИЛИ:
(x && y) (x || y)
Я только знал об условных операндах до этой точки. Я знаю то, что это делает и как применить его в операторах "if". Но какова цель логических операндов?
Я предпочитаю думать об этом как "побитовый 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
.
(x && y)
ленив. Он будет оценивать y только в том случае, если x истинно.
(x & y)
не ленив. y всегда будет оцениваться.
Обновленный ответ - мой оригинал вводил в заблуждение и был неполным.
Прежде всего, я должен извиниться за большую часть моих комментариев и ответов на этот вопрос.
После прочтения спецификации различие между побитовыми и условными операторами становится гораздо менее четким.
Согласно разделу 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.