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



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

1449   13  

13 ответов:

как & и && оператор, двойной оператор оператор "короткого замыкания".

например:

if(condition1 || condition2 || condition3)

если условие 1 истинно, условие 2 и 3 не будут проверены.

if(condition1 | condition2 | condition3)

это проверит условия 2 и 3, даже если 1 уже верно. Поскольку ваши условия могут быть довольно дорогими функциями, вы можете получить хороший прирост производительности, используя их.

есть одно большое предостережение, NullReferences или подобное проблемы. Например:

if(class != null && class.someVar < 20)

если класс равен null, то оператор if-остановится после class != null ложно. Если вы используете только&, он попытается проверить class.someVar и вы получите хороший NullReferenceException. С оператором Or это может быть не так много ловушки, поскольку маловероятно, что вы запускаете что-то плохое, но это то, что нужно иметь в виду.

никто никогда не использует один & или | операторы, хотя, если у вас нет дизайна, где каждое условие является функцией, которая имеет быть казненным. Звучит как дизайн запах, но иногда (редко) это чистый способ сделать вещи. Элемент & оператор выполняет "запуск этих 3 функций, и если одна из них возвращает false, выполните блок else", в то время как | делает "только запустить блок else, если никто не возвращает false" - может быть полезно, но, как уже было сказано, часто это дизайн запах.

есть второе использование | и & оператора, хотя: Побитовые Операции.

|| является логическим оператором OR. Похоже, вы в основном знаете, что это такое. Он используется в условных операторах, таких как if, while и т. д.

condition1 || condition2

возвращает значение true, если условие1 или условие2 истинно.

| - побитовый оператор OR. Он используется для работы с двумя числами. Вы смотрите на каждый бит каждого числа индивидуально, и если один из битов равен 1 по крайней мере в одном из чисел, то результирующий бит будет также равен 1. Вот некоторые из них примеры:

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

надеюсь, что это имеет смысл.

поэтому, чтобы ответить на последние два вопроса, я бы не сказал, что есть какие-либо предостережения, кроме "знать разницу между двумя операторами.- Они не взаимозаменяемы, потому что делают две совершенно разные вещи.

один "побитовое или".

10011b | 01000b => 11011b

другой-это логика или.

true или false = > true

хороший вопрос. Эти два оператора работают одинаково в PHP и C#.

| - это побитовое или. Он будет сравнивать два значения по их битам. Например, 1101 / 0010 = 1111. Это чрезвычайно полезно при использовании битовых опций. Например, 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): проверяет оба случая, даже если первый из них является ложным

&& - (Условие 1 & & Условие 2): Не беспокойтесь, чтобы проверить второй случай, если случай один это ложь

&& - оператор сделает ваш код работать быстрее, профессионально и редко используется

| - (Условие 1 / Условие 2): проверяет оба случая, даже если случай 1 истинен

| / - (Условие 1 / / Условие 2): не потрудитесь проверить второй случай, если первый это правда

|| - оператор сделает ваш код работать быстрее, профессионально | редко используется

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

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

в семействе языков программирования C побитовым оператором OR является " | " (pipe). Опять же, этот оператор не следует путать с его логическим "логическим или" аналогом, который обрабатывает его операнды как логические значения и записывается "||" (два канала).

по их математическому определению, или и и являются двоичными операторами; они проверяют условия LHS и RHS независимо, аналогично | и &.

| / and && изменяет свойства операторов 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. Если вы имеете дело с логической системой, которая рассматривает любое ненулевое значение как истинное, то побитовое или будет действовать так же, как логическое ИЛИ, но его аналог (побитовое и,"&") не будет. Также побитовое или не выполняет оценку короткого замыкания.

одна труба ( | ) является побитовое или оператор.

два канала ( | | ) - это логический оператор OR.

Они не заменимы.

|| (две трубы) обычно логическое или в то время как | (одна труба) является binary или. С моей головы я не могу думать о том, что разница будет большой (кроме тех случаев, когда вы назначаете результат на что-то другое). Однако я уверен, что у кого-то еще будет ситуация, когда это имеет значение.

Edit: Вау, шесть других ответов за то время, которое мне потребовалось, чтобы написать это.

побитовое Or (|) и логическое(||)! Подумайте о логике как о сопоставимых объектах в Java, сравнивая некоторые различимые "части", в то время как побитовый оператор смотрит на эти объекты и вместо того, чтобы видеть, являются ли они визуально близнецами (как это делает логика), делает образец ДНК и смотрит на 0 и 1 вместо этого.

Comments

    Ничего не найдено.