2009-08-14 12 views
34

Powiel możliwe:
A clear, layman’s explanation of the difference between | and || in c# ?Różnica między | i || lub & i && dla porównania

Jaka jest różnica między porównaniu z | i || lub & i & & w języku C# i Javascript?

Przykłady:

if(test == test1 | test1 == test2) or if(test == test1 || test1 == test2) 
if(test == test1 & test1 == test2) or if(test == test1 && test1 == test2) 
+0

w jakim języku? –

+0

W jakim języku się piszesz? –

+1

C# i javascript –

Odpowiedz

30

w C (i prawdopodobnie innych języków) pojedynczy | lub & jest porównanie bitowej.
Podwójne || lub && jest logicznym porównaniem.
Edit: Koniecznie przeczytaj komentarz Mehrdad jest poniżej dotyczące „bez zwarcia”

w praktyce, ponieważ true jest często równoznaczne z 1 i false jest często równoznaczne z 0, bitowego porównania czasami może być ważne i zwraca dokładnie taki sam wynik:.

Był kiedyś krytyczny komponent oprogramowania, na którym uruchomiłem statyczny analizator kodu, i wskazano, że zastosowano porównanie bitowe tam, gdzie powinno być logiczne porównanie. Ponieważ został napisany w C i ze względu na układ logicznych porównań, oprogramowanie działało dobrze z jednym z nich. Przykład:

if ((altitide > 10000) & (knots > 100)) 
... 
+22

W języku C# (który jest językiem mocno napisanym), używając | i & na zmiennych boolowskich spowoduje "logiczne lub/i bez zwarcia." –

+0

Wow, naprawdę? To interesujące i będę musiał dowiedzieć się więcej o C#. Zaktualizuję odpowiedź, aby wskazać Twój komentarz. – dustmachine

+0

Komentarz Mehrdada nie jest w rzeczywistości unikalny dla C# - wiele (najbardziej?) Języków mocno napisanych ma to rozróżnienie. Wiem, że jest obecny w Javie i C++, i zakładam, że jest obecny na przykład w C. –

8

& oraz | są operatorami binarnymi, gdy || i & & są wartościami logicznymi.

Duża różnica:
(1 & 2) wynosi 0, false
(1 & & 2) jest prawdą

+3

(1 && 2) nie jest prawidłową składnią C#. –

+4

Oryginalne pytanie nie wspomniało o C#. Został zredagowany po. – David

1

Instancja w którym używasz pojedynczego znaku (tj | lub &) jest bitowym porównaniem wyników. Dopóki twój język oceni te wyrażenia na wartość binarną, powinny one zwracać takie same wyniki. Jednak jako najlepsza praktyka powinieneś używać operatora logicznego, ponieważ o to ci chodzi (myślę).

3

(Zakładając, C, C++, Java, JavaScript)

| i & są operatory bitowe podczas || i && są operatory logiczne. Zwykle chcesz użyć || i && dla instrukcji if i pętli i podobnych (np. Dla twoich przykładów powyżej). Operatory bitowe służą do ustawiania i sprawdzania bitów w bitmaskach.

28

& i | są operatory bitowe, które mogą działać zarówno na liczbach całkowitych, jak i na argumentach logicznych, i & & i || są operatorami logicznymi, które mogą działać tylko z argumentami typu Boolean. W wielu językach, jeśli oba argumenty są typu Boolean, kluczową różnicą jest to, że operatory logiczne wykonają ocenę zwarcia i nie ocenią drugiego argumentu, jeśli pierwszy argument wystarczy do określenia odpowiedzi (np.w przypadku & &, jeśli pierwszy argument jest fałszywy, drugi argument jest nieistotny).

+5

upomina się o pierwsze wspomnienie o zwarciu operatorów Boole'a – David

0

& i | są zwykle operacjami bitowymi.

Gdzie jako & & i || są zwykle operacjami logicznymi.

Dla celów porównawczych wszystko jest w porządku pod warunkiem, że wszystko zwróci wartość 1 lub 0. W przeciwnym razie może zwrócić fałszywe alarmy. Powinieneś tego unikać, aby zapobiec trudnym do odczytania błędom.