В чем разница между | и || или операторов?

Я всегда использовал || (две трубы) в выражениях OR, как на C #, так и на PHP. Иногда я вижу одну используемую трубу: | , В чем разница между этими двумя обычаями? Существуют ли какие-либо оговорки при использовании одного над другим или они взаимозаменяемы?

Solutions Collecting From Web of "В чем разница между | и || или операторов?"

Как и оператор & и && , двойной оператор является оператором «короткого замыкания».

Например:

 if(condition1 || condition2 || condition3) 

Если условие 1 истинно, условия 2 и 3 НЕ будут проверяться.

 if(condition1 | condition2 | condition3) 

Это проверит условия 2 и 3, даже если 1 уже верно. Поскольку ваши условия могут быть довольно дорогими функциями, вы можете получить хороший прирост производительности, используя их.

Существует одно большое оговорка, NullReferences или аналогичные проблемы. Например:

 if(class != null && class.someVar < 20) 

Если класс равен null, if-statement остановится после class != null – false. Если вы используете только &, он попытается проверить class.someVar, и вы получите красивое NullReferenceException . С Or-Operator, который может быть не такой ловушкой, как маловероятно, что вы запускаете что-то плохое, но это то, что нужно иметь в виду.

Никто никогда не использует сингл & or | однако, если у вас нет дизайна, где каждое условие является функцией, которая должна выполняться. Звучит как дизайнерский запах, но иногда (редко) это чистый способ делать вещи. Оператор & выполняет «эти 3 функции, и если один из них возвращает false, выполните блок else», а | «запускает только блок else, если не возвращает false» – может быть полезным, но, как сказано, часто это запах дизайна.

Существует второе использование | и & оператор: Побитовые операции .

|| является логическим оператором OR. Похоже, вы в основном знаете, что это такое. Он используется в условных операторах, таких как if, while и т. Д.

 condition1 || condition2 

Вычисляет значение true, если условие condition1 ИЛИ condition2 истинно.

| является побитовым оператором ИЛИ. Он используется для работы с двумя номерами. Вы смотрите каждый бит каждого номера отдельно и, если один из битов равен 1, по крайней мере, одному из чисел, тогда результирующий бит будет равен 1. Вот несколько примеров:

 A = 01010101 B = 10101010 A | B = 11111111 A = 00000001 B = 00010000 A | B = 00010001 A = 10001011 B = 00101100 A | B = 10101111 

Надеюсь, это имеет смысл.

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

Один из них «побитовое».

10011b | 01000b => 11011b

Другая логика или.

true или false => true

Хороший вопрос. Эти два оператора работают одинаково в PHP и C #.

| является побитовым ИЛИ. Он будет сравнивать два значения по их битам. Например 1101 | 0010 = 1111. Это очень полезно при использовании опций бит. Например, Read = 01 (0X01) Запись = 10 (0X02) Чтение-запись = 11 (0X03). Один из полезных примеров – открытие файлов. Простой пример:

 File.Open(FileAccess.Read | FileAccess.Write); //Gives read/write access to the file 

|| является логическим ИЛИ. Так обстоит дело с большинством людей и сравнивает два значения, основанные на их истине. Например, я еду в магазин, или я пойду в торговый центр. Это чаще всего используется в коде. Например

 if(Name == "Admin" || Name == "Developer) { //allow access } //checks if name equals Admin OR Name equals Developer 

Ресурс PHP: http://us3.php.net/language.operators.bitwise

Ресурсы C #: http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx

Простой пример в java

 public class Driver { static int x; static int y; public static void main(String[] args) throws Exception { System.out.println("using double pipe"); if(setX() || setY()) {System.out.println("x = "+x); System.out.println("y = "+y); } System.out.println("using single pipe"); if(setX() | setY()) {System.out.println("x = "+x); System.out.println("y = "+y); } } static boolean setX(){ x=5; return true; } static boolean setY(){ y=5; return true; } } 

вывод :

 using double pipe x = 5 y = 0 using single pipe x = 5 y = 5 

Один канал, |, является одним из побитовых операторов.

Из Википедии:

В семействе языков программирования C побитовый оператор OR является «|» (Труба). Опять же, этот оператор не следует путать с его логическим «логическим» или «параллельным», который обрабатывает его операнды как булевы значения и записывается «||», (две трубы).

& – (Условие 1 и Условие 2): проверяет оба случая, даже если первый – false

&& – (Условие 1 && Условие 2): не надо проверять второй случай, если случай один неверен

&& – оператор сделает ваш код быстрее, профессионально и редко используется

| – (Условие 1 | Условие 2): проверяет оба случая, даже если случай 1 истинен

|| – (Условие 1 || Условие 2): не надо проверять второй случай, если первое верно

|| – оператор сделает ваш код быстрее, профессионально | редко используется

По их математическому определению OR и AND являются бинарными операторами; они проверяют условия LHS и RHS независимо от того, как | а также &.

|| и && изменяют свойства операторов OR и AND, останавливая их, когда условие LHS не выполняется.

| оператор выполняет побитовое ИЛИ своих двух операндов (что означает, что обе стороны должны оценивать значение false, чтобы оно возвращало false), в то время как || оператор будет оценивать только второй оператор, если это необходимо.

http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx

Синяя труба "|" является «поразрядным» или его следует использовать только тогда, когда вы знаете, что делаете. Двойная труба "||" является логическим или может использоваться в логических операторах, таких как «x == 0 || x == 1».

Вот пример того, что поразрядно или делает: если a = 0101 и b = 0011, тогда a | b = 0111. Если вы имеете дело с логической системой, которая обрабатывает любые ненулевые значения как истинные, то побитовое или будет действовать так же, как логическое или, но это аналог (побитовое и, «&») будет NOT. Также побитовое или не выполняет оценку короткого замыкания.

Один канал (|) является побитовым оператором OR .

Две трубы (||) являются логическим оператором ИЛИ.

Они не взаимозаменяемы.

|| (две трубы), как правило, логично или пока | (одна труба) является двоичной или. В верхней части моей головы я не могу думать, что разница была бы большой, если бы вы назначили результат чему-то еще. Однако я уверен, что у кого-то еще будет ситуация, когда это имеет значение.

Редактировать: Вау, шесть других ответов за то время, когда мне потребовалось написать это.

Побитовое (|) против логического (||)! Подумайте логично, как объекты Comparable в Java, сравнивая некоторые отличимые «части», в то время как побитовый оператор смотрит на эти объекты и вместо того, чтобы видеть, являются ли они визуально близнецами (как и логические), делает ли образец ДНК и смотрит на 0 и 1 вместо.