В чем разница между | и || или операторы? - PullRequest
274 голосов
/ 30 августа 2008

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

Ответы [ 13 ]

445 голосов
/ 30 августа 2008

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

Например:

if(condition1 || condition2 || condition3)

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

if(condition1 | condition2 | condition3)

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

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

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

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

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

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

70 голосов
/ 30 августа 2008

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

condition1 || condition2

Оценивается как true, если либо условие1, либо условие2 верно.

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

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

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

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

27 голосов
/ 30 августа 2008

Один - "побитовый или".

10011b | 01000b => 11011b

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

true или false => true

10 голосов
/ 30 августа 2008

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

| побитовое ИЛИ. Он будет сравнивать два значения по их битам. Например. 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

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

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

3 голосов
/ 23 марта 2012

Простой пример в 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 голосов
/ 14 ноября 2017

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

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

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

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

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

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

0 голосов
/ 24 сентября 2016

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

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

0 голосов
/ 16 июля 2009

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

0 голосов
/ 30 августа 2008

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

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

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

0 голосов
/ 30 августа 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...