В чем разница между операторами | и || or?
Вопрос
Я всегда использовал ||
(два канала) в выражениях 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.