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

249

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

Теги:
operators

13 ответов

393
Лучший ответ

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

Например:

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

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

  • 8
    Да, я не верил в это, пока не создал консольное приложение - но, боже мой! Зачем вам дать веревку, чтобы повеситься! Я ненавидел это за VB.NET - ключевые слова OrElse и AndAlso!
  • 1
    Любите короткое замыкание этих команд! Я использую это все время только для того, чтобы выполнить вторую проверку, если первая прошла успешно, например, проверка нулевого объекта: if (myObj! = Null && myObj.resultCode == 0) Console.WriteLine ("Yay!");
Показать ещё 10 комментариев
70

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

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

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

28

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

10011b | 01000b => 11011b

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

true или false => true

  • 1
    | может использоваться на типах bool также без короткого замыкания.
10
Хороший вопрос. Эти два оператора работают одинаково в 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

  • 2
    FWIW, Технически, в C # | логично или применительно к логическим значениям . Как говорится в вашей ссылке. На практике конечный результат такой же, как если бы он был побитовым оператором, потому что побитовые значения true и false таковы, что побитовые или их значения дают точно такой же результат, как и логический. То есть (int)(bool1 | bool2) == ((int)bool1) | ((int)bool2) .
4

Простой пример в 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
  • 2
    Почему бы вы дать пример Java для вопроса, который даже не упоминает Java?
1

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

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

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

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

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

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

  • 2
    rarely used ? Все зависит от того, что вы хотите или нужно сделать.
  • 0
    Большой! Короче говоря, я бы убрал слова «| редко используется» и «& редко используется», потому что, как сказала Эмаборса, это действительно зависит от того, что вы хотите или должны делать.
0

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

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

0

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

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

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

0

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

  • 0
    Если бы вы на самом деле читали эти статьи, вы бы увидели, что они ссылаются на побитовые операторы
  • 0
    Это не то, что означает побитовое.
-2

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

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

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

  • 1
    Если вы игнорируете побитовую операцию, двойная труба является ленивой оценкой, а одиночная труба жадной в пределах логической области оператора.
-2

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

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

  • 0
    '|' также может использоваться на типах bool без короткого замыкания.
-3

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

-3

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

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

Сообщество Overcoder
Наверх
Меню