Обновлено Ответ - мой оригинал был вводящим в заблуждение и неполным.
Прежде всего, я должен извиниться за большую часть своих комментариев и ответов на этот вопрос.
После прочтения спецификации различие между побитовыми и условными операторами намного менее четкое.
Согласно разделу 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.
OK. Что относительно ленивой оценки? Вы собираетесь это упомянуть? Потому что, если вы это сделаете, я могу удалить свой самый непопулярный ответ. –
Ленивая оценка - это подмножество логических операций. Следует упомянуть, но это не имеет отношения к вопросу. –
@John Weldon: Вопрос о различиях между операторами. И лень - один из них. –