Jaka jest różnica między operatorami | i | / or?

Zawsze używałem || (dwie rury) w wyrażeniach OR, zarówno w C# jak i PHP. Czasami widzę używaną pojedynczą rurę: |. Jaka jest różnica między tymi dwoma zastosowaniami? Czy są jakieś zastrzeżenia podczas używania jednego nad drugim lub czy są one wymienne?

Author: Rory O'Kane, 2008-08-29

12 answers

Podobnie jak operator & i &&, Operator podwójny jest operatorem zwarciowym.

Na przykład:

if(condition1 || condition2 || condition3)

Jeśli warunek 1 jest prawdziwy, warunek 2 i 3 nie będą sprawdzane.

if(condition1 | condition2 | condition3)

To sprawdzi Warunki 2 i 3, nawet jeśli 1 jest już prawdą. Ponieważ twoje warunki mogą być dość kosztownymi funkcjami, możesz uzyskać dobry wzrost wydajności, korzystając z nich.

Jest jedno duże zastrzeżenie, NullReferences lub podobne problemy. Na przykład:

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

Jeśli klasa jest null, Instrukcja if-zatrzyma się po class != null jest false. Jeśli używasz tylko&, spróbuje sprawdzić class.someVar i otrzymasz ładny NullReferenceException. Z operatorem Or, który może nie być aż tak wielką pułapką, ponieważ jest mało prawdopodobne, że uruchomisz coś złego, ale jest to coś, o czym należy pamiętać.

Nikt nigdy nie używa pojedynczych operatorów & lub |, chyba że masz projekt, w którym każdy warunek jest funkcją, która musi zostać wykonana. Brzmi jak zapach designu, ale czasami (rzadko) jest to czysty sposób na robienie rzeczy. Operator & wykonuje "Uruchom te 3 Funkcje i jeśli jedna z nich zwróci false, wykonaj blok else" , podczas gdy | wykonuje "tylko Uruchom blok else, jeśli żadna nie zwróci false" - może być przydatny, ale jak już wspomniano, często jest to zapach projektu.

Istnieje drugie użycie operatora | i & chociaż: operacje bitowe .

 513
Author: Michael Stum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-03 03:35:10

/ / jest operatorem logicznym OR. Wygląda na to, że w zasadzie wiesz, co to jest. Jest używany w wyrażeniach warunkowych, takich jak if, while, itd.

condition1 || condition2

Ocenia na true, jeśli warunek 1 lub warunek 2 jest true.

| jest operatorem bitowym OR. Operuje na dwóch numerach. Patrzymy na każdy bit każdej liczby z osobna i jeśli jeden z bitów ma wartość 1 w co najmniej jednej z liczb, to otrzymany bit będzie również równy 1. Oto kilka przykłady:

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111
Mam nadzieję, że to ma sens.

Więc odpowiadając na dwa ostatnie pytania, nie powiedziałbym, że są jakieś zastrzeżenia poza " poznaj różnicę między dwoma operatorami."Nie są wymienne, ponieważ robią dwie zupełnie różne rzeczy.

 82
Author: Evan Shaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-29 03:42:22

Jeden jest "bitowym or".

10011b / 01000b => 11011b

Druga to logika lub.

True or false = > true

 32
Author: nsanders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-21 11:19:48

Dobre pytanie. Te dwa operatory działają tak samo w PHP i C#.

| jest bitowym OR. Porównuje dwie wartości według ich bitów. Np. 1101 / 0010 = 1111. Jest to niezwykle przydatne podczas korzystania z opcji bitowych. Np. Read = 01 (0x01) Write = 10 (0x02) Read-Write=11 (0x03). Jednym z użytecznych przykładów byłoby otwieranie plików. Prostym przykładem może być:

File.Open(FileAccess.Read | FileAccess.Write);  //Gives read/write access to the file

|| jest logicznym OR. W ten sposób większość ludzi myśli o OR i porównuje dwie wartości oparte na ich prawdzie. Np. Idę Do sklepu albo do centrum handlowego. Jest to ta używana najczęściej w kodzie. Na przykład:

if(Name == "Admin" || Name == "Developer") { //allow access } //checks if name equals Admin OR Name equals Developer

PHP Resource: http://us3.php.net/language.operators.bitwise

C# Resources: http://msdn.microsoft.com/en-us/library/kxszd0kx (VS. 71). aspx

Http://msdn.microsoft.com/en-us/library/6373h346 (VS. 71). aspx

 15
Author: Trevor Abell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-12 21:02:42

& - (warunek 1 & warunek 2): sprawdza oba przypadki, nawet jeśli pierwszy jest fałszywy

& & - (warunek 1 && warunek 2): dosen ' t trud to check second case if case one is false

& & - operator sprawi, że Twój kod będzie działał szybciej, profesjonalnie i jest rzadko używany

| - (warunek 1 | warunek 2): sprawdza oba przypadki, nawet jeśli przypadek 1 jest prawdziwy

/ / - (warunek 1 / / warunek 2): dosen ' t trud to check second case if first one is true

/ / - operator sprawi, że Twój kod będzie działał szybciej, profesjonalnie / jest rzadko używany

 8
Author: Bhai Saab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-14 03:58:55

Prosty przykład w Javie

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;
  }
}

Wyjście:

using double pipe
x = 5
y = 0
using single pipe
x = 5
y = 5
 5
Author: vishesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-23 08:02:48

Rura pojedyncza,/, jest jednym z operatorów bitowych .

Z Wikipedii:

W rodzinie języków programowania C operatorem bitowym OR jest " / " (pipe). Operator ten nie może być mylony z jego Boolowskim odpowiednikiem "logical or", który traktuje swoje operandy jako wartości boolowskie i jest zapisywany jako "/ / " (dwie rury).

 0
Author: codeLes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-29 21:26:59

Poprzez swoją matematyczną definicję, or and and są operatorami binarnymi; sprawdzają warunki LHS i RHS niezależnie, podobnie jak / and &.

/ / i & & zmienia właściwości operatorów OR I AND, zatrzymując je, gdy warunek LHS nie jest spełniony.

 0
Author: Dragos Bandur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-24 14:44:43

Dla bitów | i Logicall ||

Lub

Bitowe & i logicall &&

To znaczy if( a>b | a==0) w tym pierwszym lewym a>b zostanie ocenione, a następnie a==0 zostanie ocenione, a następnie | zostanie wykonana operacja

But in || if a>b then if wont check for next RHS

Podobnie dla & I & &

if(A>0 & B>0)

Będzie oceniać LHS, a następnie RHS, a następnie bitowo & ale

W (A>0 && B>0)

if(A>0) jest false (LHS) będzie bezpośrednio return false;

 0
Author: RvSingh3213,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-18 12:15:33

Operator / wykonuje bitowo lub ze swoich dwóch operandów (co oznacza, że obie strony muszą obliczyć false, aby zwrócił false), podczas gdy operator / / oceni drugi operator tylko wtedy, gdy będzie tego potrzebował.

Http://msdn.microsoft.com/en-us/library/kxszd0kx (VS. 71). aspx

Http://msdn.microsoft.com/en-us/library/6373h346 (VS. 71). aspx

 -2
Author: homeskillet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-29 21:15:23

Piszczałka " / "jest" bitowym " or i powinna być używana tylko wtedy, gdy wiesz, co robisz. Podwójna rura " | | "jest logicznym or i może być używana w wyrażeniach logicznych, takich jak "x == 0 / / x == 1".

Oto przykład tego, co robi bitowe or: Jeśli a=0101 i b=0011, to a|b=0111. Jeśli masz do czynienia z systemem logicznym, który traktuje wszelkie niezerowe jako prawdziwe, to bitowe or będzie działać w taki sam sposób jak logiczne or, ale jego odpowiednik (bitowe and,"&") nie będzie. Również bitowo lub nie wykonuje oceny zwarcia.

 -2
Author: Kyle Cronin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-29 21:15:51

Pojedyncza rura (|) jest operatorem bitowym OR.

Two pipes (||) jest operatorem logicznym OR.

Nie są wymienne.

 -2
Author: Dane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-29 21:16:42