Ответы:
Как &
и &&
оператор and , двойной оператор является оператором «короткого замыкания».
Например:
if(condition1 || condition2 || condition3)
Если условие 1 истинно, условия 2 и 3 НЕ будут проверены.
if(condition1 | condition2 | condition3)
Это проверит условия 2 и 3, даже если 1 уже верно. Поскольку ваши условия могут быть довольно дорогими функциями, вы можете получить хороший прирост производительности, используя их.
Есть одна большая оговорка, NullReferences или подобные проблемы. Например:
if(class != null && class.someVar < 20)
Если class равен нулю, оператор if остановится после того, class != null
как false. Если вы используете только &, он попытается проверить, class.someVar
и вы получите хороший NullReferenceException
. С оператором «Ор» это может быть не такой уж ловушкой, так как маловероятно, что вы вызовете что-то плохое, но об этом следует помнить.
Тем не менее, никто никогда не использует одиночный оператор &
или |
операторы, если только у вас нет схемы, в которой каждое условие является функцией, которая должна выполняться. Звучит как запах дизайна, но иногда (редко) это чистый способ делать вещи. &
Оператор не «запустить эти 3 функции, и если один из них возвращает ложь, выполнить еще блок», в то время как |
это «только запустить еще блок , если ни один возвращение ложным» - может быть полезным, но , как сказал, часто это дизайн запах.
Существует и второе использование оператора |
and &
: побитовые операции .
&
и |
как условные операторы - это взлом, и они будут иметь проблемы, если им когда-либо понадобится использование C / C ++: 1 && 2
true, а 1 & 2
false.
&
чтобы передать значение, отличное от того, что оно почти всегда означает: побитовый-и) .
|| логический оператор ИЛИ Похоже, вы в основном знаете, что это такое. Используется в условных выражениях, таких как 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
Надеюсь, это имеет смысл.
Поэтому, чтобы ответить на два последних вопроса, я бы не сказал, что есть какие-то предостережения, кроме «знайте разницу между двумя операторами». Они не взаимозаменяемы, потому что они делают две совершенно разные вещи.
Хороший вопрос. Эти два оператора работают одинаково в 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
|
это логично или применительно к логическим значениям . Как указано в вашей ссылке. На практике конечный результат такой же, как если бы он был побитовым оператором, потому что побитовые значения true
и false
таковы, что побитовые или их значения дают точно такой же результат, как и логический. Это (int)(bool1 | bool2)
== ((int)bool1) | ((int)bool2)
.
Простой пример в 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): не беспокойтесь о проверке второго случая, если первый случай ложный
&& - оператор заставит ваш код работать быстрее, профессионально и редко используется
| - (Условие 1 | Условие 2): проверяет оба случая, даже если случай 1 истинен
|| - (Условие 1 || Условие 2): не беспокойтесь о проверке второго случая, если первый - правда
|| - оператор заставит ваш код работать быстрее, профессионально | редко используется
rarely used
? Все зависит от того, что вы хотите или нужно сделать.
Одиночная труба, |, является одним из побитовых операторов.
Из Википедии:
В семействе языков программирования C побитовый оператор ИЛИ "|" (Труба). Опять же, этот оператор не следует путать с его логическим «логическим или» аналогом, который обрабатывает свои операнды как логические значения и записывается как «||» (две трубы).
По их математическому определению OR и AND являются бинарными операторами; они проверяют условия LHS и RHS независимо, аналогично | и &.
|| и && изменяют свойства операторов OR и AND, останавливая их, когда условие 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. Если вы имеете дело с логической системой, которая обрабатывает любое ненулевое значение как истинное, то побитовое или будет действовать так же, как логическое или, но его аналог (побитовое и, "&") не будет. Также побитовый или не выполняет оценку короткого замыкания.
bool
типах без короткого замыкания.
Одиночная труба (|) является побитовым оператором ИЛИ .
Два канала (||) - логический оператор ИЛИ.
Они не являются взаимозаменяемыми.