В чем разница между | и || или операторы?

c# php operators

109627 просмотра

13 ответа

Я всегда использовал ||(две трубы) в выражениях OR, как в C #, так и в PHP. Иногда я вижу единственную трубу используется: |. В чем разница между этими двумя способами? Есть ли какие-либо предостережения при использовании одного поверх другого или они взаимозаменяемы?

Автор: GloryFish Источник Размещён: 13.06.2019 12:04

Ответы (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 &: побитовые операции .

Автор: Michael Stum Размещён: 29.08.2008 09:17

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:17

27 плюса

Один из них - «побитовый или».

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:23

3 плюса

Простой пример в 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:58

0 плюса

Одиночная труба, |, является одним из побитовых операторов.

Из Википедии:

В семействе языков программирования C оператор побитового ИЛИ - "|" (Труба). Опять же, этот оператор не следует путать с его логическим «логическим или» аналогом, который обрабатывает свои операнды как логические значения и записывается как «||» (две трубы).

Автор: codeLes Размещён: 29.08.2008 09:26

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
Вопросы из категории :
32x32