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

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

13 ответов


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

например:

if(condition1 || condition2 || condition3)

если condition1 истинно, условие 2 и 3 не будут проверены.

if(condition1 | condition2 | condition3)

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

есть одно большое предостережение, NullReferences или подобное проблемы. Например:

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

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

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

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


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

condition1 || condition2

вычисляет значение true, если condition1 или condition2 равно true.

/ - побитовый оператор OR. Он используется для работы с двумя числами. Вы смотрите на каждый бит каждого числа отдельно, и если один из битов равен 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. Это чрезвычайно полезно при использовании параметров bit. Например. Read = 01 (0X01) Write = 10 (0X02) Read-Write = 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

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

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

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

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

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

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


одиночная труба,|, одна из побитовое операторы.

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

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


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

/ / и && измените свойства операторов OR и и, остановив их, когда условие 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. Если вы имеете дело с логической системой, которая рассматривает любое ненулевое значение как истинное, то побитовое или будет действовать так же, как логическое ИЛИ, но это аналог (побитовое и,"&") не будет. Также побитовое или не выполняет оценку короткого замыкания.


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

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

Они не заменимы.


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

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


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