В чем разница между | и || или операторы?
109627 просмотра
13 ответа
Я всегда использовал ||
(две трубы) в выражениях OR, как в C #, так и в PHP. Иногда я вижу единственную трубу используется: |
. В чем разница между этими двумя способами? Есть ли какие-либо предостережения при использовании одного поверх другого или они взаимозаменяемы?
Ответы (13)
446 плюса
Как &
и &&
оператор 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
. С Or-Operator это может быть не такой уж ловушкой, так как маловероятно, что вы вызовете что-то плохое, но об этом следует помнить.
Тем не менее, никто никогда не использует сингл &
или |
операторы, если только у вас нет схемы, в которой каждое условие является функцией, которая должна быть выполнена. Звучит как запах дизайна, но иногда (редко) это чистый способ делать вещи. &
Оператор не «запустить эти 3 функции, и если один из них возвращает ложь, выполнить блок еще», а |
значит «работать только блок еще , если ничего не вернуть ложь» - может быть полезным, но , как сказал, часто это дизайн запах.
Существует и второе использование оператора |
and &
: побитовые операции .
70 плюса
|| логический оператор ИЛИ Похоже, вы в основном знаете, что это такое. Используется в условных выражениях, таких как 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
Надеюсь, это имеет смысл.
Поэтому, чтобы ответить на два последних вопроса, я бы не сказал, что есть какие-то предостережения, кроме «знайте разницу между двумя операторами». Они не взаимозаменяемы, потому что они делают две совершенно разные вещи.
Автор: Evan Shaw Размещён: 29.08.2008 09:1727 плюса
Один из них - «побитовый или».
10011b | 01000b => 11011b
Другой логика или.
Автор: nsanders Размещён: 29.08.2008 09:13правда или ложь => правда
10 плюса
Хороший вопрос. Эти два оператора работают одинаково в 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
Автор: Trevor Abell Размещён: 29.08.2008 09:233 плюса
Простой пример в 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
Автор: vishesh
Размещён: 23.03.2012 08:02
2 плюса
& - (Условие 1 и Условие 2): проверяет оба случая, даже если первый неверен
&& - (Условие 1 && Условие 2): не беспокойтесь о проверке второго случая, если первый случай ложный
&& - оператор заставит ваш код работать быстрее, профессионально и редко используется
| - (Условие 1 | Условие 2): проверяет оба случая, даже если случай 1 истинен
|| - (Условие 1 || Условие 2): не беспокойтесь о проверке второго случая, если первый - правда
|| - оператор заставит ваш код работать быстрее, профессионально | редко используется
Автор: Bhai Saab Размещён: 14.11.2017 03:580 плюса
Одиночная труба, |, является одним из побитовых операторов.
Из Википедии:
Автор: codeLes Размещён: 29.08.2008 09:26В семействе языков программирования C оператор побитового ИЛИ - "|" (Труба). Опять же, этот оператор не следует путать с его логическим «логическим или» аналогом, который обрабатывает свои операнды как логические значения и записывается как «||» (две трубы).
0 плюса
По их математическому определению OR и AND являются бинарными операторами; они проверяют условия LHS и RHS независимо, аналогично | а также &.
|| и && изменяют свойства операторов OR и AND, останавливая их, когда условие LHS не выполняется.
Автор: Dragos Bandur Размещён: 24.09.2016 02:44-1 плюса
| оператор выполняет побитовое ИЛИ своих двух операндов (то есть обе стороны должны иметь значение false, чтобы он возвращал false), в то время как || Оператор будет оценивать только второй оператор, если это необходимо.
http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx
http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx
Автор: homeskillet Размещён: 29.08.2008 09:15-1 плюса
Опорная труба "|" является «побитовым» или и должен использоваться только тогда, когда вы знаете, что делаете. Двойная труба "||" является логическим или, и может использоваться в логических утверждениях, таких как «x == 0 || x == 1».
Вот пример того, что поразрядно или делает: если a = 0101 и b = 0011, то a | b = 0111. Если вы имеете дело с логической системой, которая обрабатывает любое ненулевое значение как истинное, то побитовое или будет действовать так же, как логическое или, но его аналог (побитовое и, "&") НЕ будет. Также побитовый или не выполняет оценку короткого замыкания.
Автор: Kyle Cronin Размещён: 29.08.2008 09:15-2 плюса
Одиночный канал (|) является побитовым оператором ИЛИ .
Два канала (||) - логический оператор ИЛИ.
Они не являются взаимозаменяемыми.
Автор: Dane Размещён: 29.08.2008 09:16-2 плюса
|| (две трубы) обычно логично или время | (одна труба) является двоичным или. Вдобавок ко всему, я не могу думать ни о каком случае, когда разница будет большой ошибкой (кроме случаев, когда вы назначаете результат чему-то другому). Однако я уверен, что у кого-то еще будет ситуация, когда это имеет значение.
Edit: Wow, шесть других ответов за то время, которое потребовалось мне, чтобы написать это.
Автор: David Locke Размещён: 29.08.2008 09:16-4 плюса
Побитовое (|) и логическое (||)! Думайте о логических объектах Comparable в Java, сравнивая некоторые различимые «части», в то время как побитовый оператор смотрит на эти объекты и вместо того, чтобы видеть, являются ли они визуально близнецами (как это делает логика), делает образец ДНК и смотрит на 0 и 1 вместо.
Автор: mduvall Размещён: 16.07.2009 08:12Вопросы из категории :
- c# Преобразовать десятичную в двойную?
- c# Как рассчитать чей-то возраст в C #?
- c# Как вы сортируете словарь по значению?
- c# В чем разница между int и Integer в Java и C #?
- c# Как создать новый экземпляр объекта из Типа
- c# Datatable против Dataset
- php Как вы отлаживаете PHP-скрипты?
- php Заставьте XAMPP / Apache обслуживать файл вне htdocs
- php Как включить файлы PHP, которые требуют абсолютного пути?
- php Скрипт входа со скрытыми кнопками
- php How can I find unused functions in a PHP project
- php Эффективное изменение размера JPEG изображения в PHP
- operators В чем разница между | и || или операторы?
- operators Что делает оператор запятой?
- operators Чем отличаются операторы сравнения PHP (== double equals) и тождества (=== triple equals)?
- operators Как получить десятичное значение при использовании оператора деления в Python?
- operators Что такое операторы побитового сдвига (bit-shift) и как они работают?
- operators В чем разница между '/' и '//' при использовании для деления?