Вопрос

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

Это было полезно?

Решение

Так же, как операторы & amp; и & amp; & amp; , двойной оператор является "коротким замыканием"; Оператор.

Например:

if(condition1 || condition2 || condition3)

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

if(condition1 | condition2 | condition3)

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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 (ПРОТИВ 71).aspx

http://msdn.microsoft.com/en-us/library/6373h346 (ПРОТИВ 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):проверяет оба случая, даже если первый из них является ложным

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

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

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

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

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

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

Из Википедии

  

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

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

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

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

http://msdn.microsoft.com/ ан-нас / библиотека / kxszd0kx (VS.71) .aspx

http://msdn.microsoft.com/ ан-нас / библиотека / 6373h346 (VS.71) .aspx

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

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

Один канал (|) - это побитовый оператор ИЛИ .

Два канала (||) - это логический оператор ИЛИ.

Они не являются взаимозаменяемыми.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top