2009-08-14 2 views
34

Можно создать дубликат:
A clear, layman’s explanation of the difference between | and || in c# ?Разница между | и || или & и && для сравнения

В чем разница между сравнением с | и || или & и & & в C# и Javascript?

Примеры:

if(test == test1 | test1 == test2) or if(test == test1 || test1 == test2) 
if(test == test1 & test1 == test2) or if(test == test1 && test1 == test2) 
+0

какой язык? –

+0

На каком языке вы говорите? –

+1

C# и javascript –

ответ

30

в C (и других языках, вероятно) один | или & сравнение побитовое.
Двойной || или && является логическим сравнением.
Edit: Обязательно прочитайте комментарий Мердада в ниже относительно «без короткого замыкания»

На практике, так как true часто эквивалентен 1 и false часто эквивалентно 0 побитовое сравнение иногда может быть действительным и возвращает точно такой же результат.

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

if ((altitide > 10000) & (knots > 100)) 
... 
+22

В C# (который является строго типизированным языком), используя | и & по логическим переменным приведет к «логическому или/или без короткого замыкания». –

+0

Вау, правда? Это интересно, и мне нужно больше узнать о C#. Я уточню ответ, чтобы указать на ваш комментарий. – dustmachine

+0

Комментарий Мехрдада на самом деле не уникален для C# - многие (большинство?) Сильно типизированных языков имеют это различие. Я знаю, что он присутствует в Java и C++, и я предполагаю, что он присутствует в C, например. –

8

& и | являются бинарными операторами, а || и & & являются булевыми.

Большая разница:
(1 & 2) является 0, ложно
(1 & & 2) верно

+3

(1 && 2) недействителен синтаксисом C#. –

+4

Исходный вопрос не упоминал C#. После этого он был отредактирован. – David

1

Экземпляр, в котором вы используете один символ (т.е. | или &) является поразрядным сравнением результатов. Пока ваш язык оценивает эти выражения двоичным значением, они должны возвращать те же результаты. Однако в качестве наилучшей практики вы должны использовать логический оператор, поскольку это то, что вы имеете в виду (я думаю).

3

(Предполагается, что C, C++, Java, JavaScript)

| и & являются битовые операторы, а || и && являются логические операторы. Обычно вы хотите использовать || и && для операторов и циклов if и т. Д. (Т. Е. Для ваших примеров выше). Побитовые операторы предназначены для установки и проверки битов в битмаксах.

28

& и | являются побитовыми операторами, которые могут работать как с целыми, так и с булевыми аргументами, и & & и || являются логическими операторами, которые могут работать только с логическими аргументами. На многих языках, если оба аргумента являются логическими, ключевое различие состоит в том, что логические операторы будут выполнять оценку короткого замыкания и не будут оценивать второй аргумент, если для определения ответа достаточно первого аргумента (например,в случае & &, если первый аргумент ложный, второй аргумент не имеет значения).

+5

upvote для того, чтобы в первую очередь упомянуть короткое замыкание булевых операторов – David

0

& и | обычно являются побитовыми операциями.

Адрес & & и || обычно являются логическими операциями.

Для сравнения это прекрасно, если все возвращает либо 1, либо 0. В противном случае он может возвращать ложные срабатывания. Вы должны избегать этого, хотя для предотвращения трудночитаемых ошибок.

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