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

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

Ответы

Ответ 1

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

Например:

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" - может быть полезным, но, как сказано, часто это дизайнерский запах.

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

Ответ 2

|| является логическим оператором 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

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

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

Ответ 3

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

10011b | 01000b => 11011b

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

true или false => true

Ответ 4

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

| побитовое ИЛИ. Он будет сравнивать два значения по их битам. Например, 1101 | 0010 = 1111. Это очень полезно при использовании битовых опций. Например, чтение = 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

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

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

Ответ 5

Простой пример в 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

Ответ 6

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

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

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

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

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

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

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

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

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

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

Ответ 10

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

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

Ответ 11

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

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

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

Ответ 12

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

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

Ответ 13

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