В чем разница между операторами | and || or?
Я всегда использовал ||
(два канала) в выражениях OR, как в C#, так и в PHP. Иногда я вижу, что используется одна труба:|
. В чем разница между этими двумя обычаи? Есть ли какие-либо оговорки при использовании одного над другим или они взаимозаменяемы?
13 ответов
как &
и &&
оператор, двойной оператор оператор" короткого замыкания".
например:
if(condition1 || condition2 || condition3)
если condition1 истинно, условие 2 и 3 не будут проверены.
if(condition1 | condition2 | condition3)
это проверит условия 2 и 3, даже если 1 уже истинно. Поскольку ваши условия могут быть довольно дорогими функциями, вы можете получить хорошее повышение производительности, используя их.
есть одно большое предостережение, NullReferences или подобное проблемы. Например:
if(class != null && class.someVar < 20)
если class равен null, оператор if остановится после class != null
ложно. Если вы используете только&, он попытается проверить class.someVar
и вы получите хороший NullReferenceException
. С Or-оператором это может быть не так много ловушки, как маловероятно, что вы запускаете что-то плохое, но это то, что нужно иметь в виду.
никто никогда не использует один &
или |
операторы, хотя, если у вас нет дизайна, где каждое условие является функцией, которая имеет быть казненным. Звучит как запах дизайна, но иногда (редко) это чистый способ делать вещи. The &
оператор выполняет "запуск этих 3 функций, и если одна из них возвращает false, выполните блок else", в то время как |
"запускает только блок else, если никто не возвращает false" - может быть полезно, но, как сказано, часто это запах дизайна.
существует второе использование |
и &
оператор though:Побитовые Операции.
/ / является логическим оператором 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
надеюсь, это имеет смысл.
поэтому, чтобы ответить на последние два вопроса, я бы не сказал, что есть какие-либо оговорки, кроме "знать разницу между двумя операторами."Они не взаимозаменяемы, потому что они делают две совершенно разные вещи.
хороший вопрос. Эти два оператора работают одинаково в PHP и C#.
| - это побитовое или. Он будет сравнивать два значения по их битам. Е. Г. 1101 | 0010 = 1111. Это чрезвычайно полезно при использовании параметров bit. Например. Read = 01 (0X01) Write = 10 (0X02) Read-Write = 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
простой пример в 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): проверяет оба случая, даже если первый из них false
&&- (Условие 1 & & Условие 2): не потрудитесь проверить второй случай, если случай один ложь
&& - оператор сделает ваш код работать быстрее, профессионально и редко используется
| - (Условие 1 / Условие 2): проверяет оба случая, даже если случай 1 истинен
| / - (Условие 1 / / Условие 2): не потрудитесь проверить второй случай, если первый одно верно
|| - оператор сделает ваш код работать быстрее, профессионально | редко используется
одиночная труба,|, одна из побитовое операторы.
Из Википедии:
в семействе языков программирования C побитовым оператором OR является " | " (pipe). Опять же, этот оператор не следует путать с его логическим "логическим или" аналогом, который обрабатывает его операнды как логические значения и записывается "||" (два канала).
по их математическому определению, или и и являются двоичными операторами; они проверяют условия LHS и RHS независимо, аналогично | и &.
/ / и && измените свойства операторов OR и и, остановив их, когда условие 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. Если вы имеете дело с логической системой, которая рассматривает любое ненулевое значение как истинное, то побитовое или будет действовать так же, как логическое ИЛИ, но это аналог (побитовое и,"&") не будет. Также побитовое или не выполняет оценку короткого замыкания.
одна труба ( | ) является побитовый оператор OR.
два канала (||) является логическим оператором OR.
Они не заменимы.
|| (две трубы) обычно логическое или | (одна труба)бинарные или. С моей головы, я не могу думать о том, когда разница будет большой gotcha (кроме того, когда вы назначаете результат чему-то другому). Однако я уверен, что у кого-то еще будет ситуация, когда это имеет значение.
Edit: Вау, шесть других ответов за то время, пока я писал это.
побитовое Or (|) и логическое(||)! Подумайте о логике как о сопоставимых объектах в Java, сравнивая некоторые различимые "части", в то время как побитовый оператор смотрит на эти объекты и вместо того, чтобы видеть, являются ли они визуально близнецами (как это делает логика), делает образец ДНК и смотрит на 0 и 1 вместо этого.