




Один из них - «поразрядное или».
10011b | 01000b => 11011b
Другой - логика или.
true or false => true
| оператор выполняет поразрядное ИЛИ для двух своих операндов (это означает, что обе стороны должны вычислить ложь, чтобы вернуть ложь), в то время как || оператор будет оценивать второй оператор только в случае необходимости.
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 без короткого замыкания.
Одиночная труба (|) - это побитовый оператор ИЛИ.
Две трубы (||) - это логический оператор ИЛИ.
Они не взаимозаменяемы.
Если вы проигнорируете поразрядную операцию, двойной канал будет ленивым вычислением, а одиночный канал будет жадным в области логических операторов.
|| является логическим оператором ИЛИ. Похоже, вы в основном знаете, что это такое. Он используется в условных операторах, таких как if, while и т. д.
condition1 || condition2
Возвращает истину, если истинно условие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
Надеюсь, это имеет смысл.
Итак, чтобы ответить на два последних вопроса, я бы не сказал, что есть какие-либо предостережения, кроме «знай разницу между двумя операторами». Они не взаимозаменяемы, потому что делают две совершенно разные вещи.
Это помогло мне понять, как кто-то использовал побитовый оператор ИЛИ для объединения фильтров в драйвере Mongodb C#. gist.github.com/a3dho3yn/…
Подобно операторам & и &&, оператор double является оператором «короткого замыкания».
Например:
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 станет ложным. Если вы используете только &, он попытается проверить class.someVar, и вы получите хороший NullReferenceException. С оператором или это может быть не такой уж большой ловушкой, поскольку маловероятно, что вы вызовете что-то плохое, но об этом следует помнить.
Однако никто никогда не использует отдельные операторы & или |, если только у вас нет проекта, в котором каждое условие является функцией, которую ОБЯЗАТЕЛЬНО нужно выполнить. Похоже на запах дизайна, но иногда (редко) это чистый способ делать что-то. Оператор & «запускает эти 3 функции, и если одна из них возвращает false, выполняет блок else», тогда как | «запускает только блок else, если ни один из них не возвращает false» - может быть полезно, но, как уже говорилось, часто это дизайнерский запах.
Однако есть и второе использование операторов | и &: Побитовые операции.
Да, я не верил в это, пока не создал консольное приложение - но Боже мой! Зачем им давать веревку, чтобы повеситься! Я ненавидел это в VB.NET - ключевые слова OrElse и AndAlso!
Мне нравится короткое замыкание этих команд! Я использую это все время, чтобы выполнить вторую проверку только в случае успеха первой, например проверку нулевого объекта: if (myObj! = Null && myObj.resultCode == 0) Console.WriteLine ("Ура!");
Конечно, может быть, мне стоит прочитать ответ целиком, прежде чем копировать его часть!
Обучение людей использованию & и | в качестве условных операторов - это хитрость, и у них возникнут проблемы, если им когда-нибудь понадобится использовать C / C++: 1 && 2 истинно, а 1 & 2 ложно.
Это не взлом, это официально указано для C# в Разделе 7.10.3. Логические логические операторы: «Результат x | y истинен, если x или y истинно. В противном случае результат ложный». Также см. Раздел 7.11. Условные логические операторы: «Операция x || y соответствует операции x | y, за исключением того, что y вычисляется, только если x ложно». который в дальнейшем «легализует» | как условный оператор. И люди, которые будут использовать C / C++, в любом случае столкнутся с проблемами, если будут слепо полагать, что все работает одинаково. Как сказано: Использование | в выражении if - запах дизайна, но вполне законная операция.
Я никогда не говорил, что это незаконно, просто это взлом, а это (вы используете & для передачи значения, отличного от того, что он почти всегда означает: побитовое и).
Это не взлом, если он делает то, для чего был создан.
@ BlueRaja-DannyPflughoeft Назвать задокументированную функцию взломом, когда в документации сказано, что она предназначена для использования, все равно, что сказать с помощью оператора switch «взлом elseif». Это инструмент в ящике для инструментов, возможно, редко используемый специальный инструмент, но тем не менее инструмент.
@Gent: Правило №1 при написании программного обеспечения - сделать ваш код максимально понятным и читаемым. Если вы используете «редко используемый» синтаксис, который неправильно передает ваши намерения и сбивает с толку многих читателей, то когда есть гораздо более ясная альтернатива, это плохой код. Это взлом.
@ BlueRaja-DannyPflughoeft, согласно этой логике, циклам do и while нет места в вашем приложении, потому что они редко используются в большинстве разработанных мной бизнес-приложений. Называя это взломом, вы навязываете свое мнение и предполагаете, что КТО-либо не имеет веских причин использовать его. ОП спросил, в чем разница и какие предостережения при ее использовании.
Вы говорили о повышении производительности, которое может быть достигнуто за счет использования логических логических операторов в случае дорогостоящих функций, не могли бы вы добавить несколько слов, поскольку я понял, что условные операторы сэкономят накладные расходы, поскольку они прекращают оценку, когда результат предсказуем , но я думаю, вы имели в виду другую ситуацию ...
Кстати, в php | это Только - побитовый оператор. Этот ответ верен для C#, но не совсем подходит для php. В php нет логического оператора без короткого замыкания. логические операторы php
не должен "... в то время как | выполняет 'только блок else, если ни один из них не возвращает false'" фактически быть ", в то время как | выполняет 'только блок else, если ни один из них не возвращает истинный'"?
Хороший вопрос. Эти два оператора работают одинаково в 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
FWIW, технически в C# | - это логический или при применении к булевы. Как указано в вашей связанной ссылке. На практике конечный результат такой же, как если бы это был побитовый оператор, потому что побитовые значения true и false таковы, что побитовое или их значений дает тот же результат, что и логический или. То есть (int)(bool1 | bool2) == ((int)bool1) | ((int)bool2).
Одиночный канал | - это один из операторов побитовый.
Из Википедии:
In the C programming language family, the bitwise OR operator is "|" (pipe). Again, this operator must not be confused with its Boolean "logical or" counterpart, which treats its operands as Boolean values, and is written "||" (two pipes).
Простой пример на 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
Зачем приводить пример java для вопроса, в котором даже не упоминается java?
По математическому определению ИЛИ и И являются бинарными операторами; они проверяют условия LHS и RHS независимо, аналогично | и &.
|| и && изменяют свойства операторов OR и AND, останавливая их, когда условие LHS не выполняется.
& - (Условие 1 и Условие 2): проверяет оба случая, даже если первый неверен
&& - (Условие 1 && Условие 2): не пытайтесь проверить второй случай, если случай первый ложно
&& - оператор заставит ваш код работать быстрее, профессиональнее и редко используется
| - (Условие 1 | Условие 2): проверяет оба случая, даже если случай 1 истинен
|| - (Условие 1 || Условие 2): не пытайтесь проверить второй случай, если первый одна правда
|| - оператор заставит ваш код работать быстрее, профессионально | редко используется
rarely used? Все зависит от того, что вы хотите или должны делать.
Большой! Коротко и мило, я бы удалил «| редко используется» и «& редко используется», потому что, как сказал Emaborsa, это действительно зависит от того, что вы хотите или должны делать.
Для побитового | и логического ||
ИЛИ ЖЕ
побитовый & и логический &&
это значит if ( a>b | a==0)
сначала слева будет оцениваться a>b, а затем a==0, затем будет выполнена операция |
но в || if a>b, если не проверять следующий RHS
Аналогично для & и &&
if (A>0 & B>0)
он будет оценивать LHS, а затем RHS, затем побитовый & но
in(A>0 && B>0)
if (A>0) - это false (LHS), он будет напрямую return false;
|может использоваться с типамиboolбез короткого замыкания.