2008-11-13 11 views
8

Jeśli jestem oceniając dwie zmienne i nie dwa wywołania metod ma znaczenie pogodę używam „& &” lub „&”Czy jest to czas, kiedy && (AndAlso) nie ma znaczenia nad i (A)

//some logic that sets bool values 

boolean X = true; 
boolean Y = true; 

if (X & Y){ 
    // perform some operation 
} 

if (X && Y){ 
    // perform some operation 
} 

Dalsze książki używam do C# 3.0/.NET 3.5 odnosi się tylko do operatora & &, czy operator & odchodzi?

Odpowiedz

3

Jak zaobserwowano, & jest operatorem bitowym AND. Surowa binarna matematyka wydaje się być coraz mniej powszechna w miarę upływu czasu, a coraz więcej programistów nie rozumie tak naprawdę arytmetyki bitowej. Czasami może to być ból.

Jednak istnieje wiele zadań, które najlepiej rozwiązują takie problemy, w szczególności wszystko, co wygląda na dane jako flagi. Operator & jest w 100% niezbędny i nigdzie się nie wybiera - po prostu nie jest tak często używany, jak operator boolowskich zwarć &&.

Na przykład:

[Flags] 
enum SomeEnum { // formatted for space... 
    None = 0, Foo = 1, Bar = 2 // 4, 8, 16, 32, ... 
} 
static void Main() { 
    SomeEnum value = GetFlags(); 
    bool hasFoo = (value & SomeEnum.Foo) != 0; 
} 
static SomeEnum GetFlags() { ... } 
9

Zawsze używaj & &, jeśli wykonujesz test logiczny true/false. Pojedynczy & wykonuje bit-mądry "i". W niektórych przypadkach sprawiają one wrażenie testu logicznego, ale nie gwarantuje się, że będzie działać we wszystkich przypadkach logicznych. Najczęstszym zastosowaniem pojedynczego & jest zastosowanie maski bitowej.

Przykłady (& &):

true && true == true 

przykład (&)

00101001 & 00100001 = 00100001 
1

& jest operatorem bitowe podczas & & jest i operatora. Dwie całkowicie różne operacje.

int a = 1; 
int b = 2; 
assert (a & b == 0) 
assert (a && b == true) 

EDYCJA: Ooops ... ten przykład nie działa w języku C#. Powinno to być w C++. Mam nadzieję, że ilustruje zamiar i różnicę między dwoma operatorami.

+0

W języku C# jeden i działa zgodnie z przeznaczeniem. –

+0

Próbowałem go i kompilator narzekał: Operator '&' nie może być zastosowany do operandów typu 'int' i 'bool' – jpoh

+0

To dlatego, że int nie jest wartością 8-bitową. Musisz odrzucić bajt do int, aby działało. – FlySwat

7

Jeśli używasz pojedynczej & (And) obliczana jest druga część wyrażenia. Może to być złe, jeśli druga część będzie polegać na tym, że pierwsza część jest prawdziwa. Zwykle zawsze używaj & &, ponieważ druga część nie jest oceniana, jeśli pierwsza część jest fałszywa.

Logicznie pojedynczy & wykonuje operację bitową, jak powiedzieli inni, co jest nadal ważne dla porównania/oceny Boole'a. Naprawdę jedyny czas, w którym powinno się używać pojedynczego & (lub |) (lub oceny boolowskiej), jeśli druga ocena powinna zawsze być uruchomiona (jeśli jest to wywołanie funkcji/modyfikator). Jest to zła praktyka i prawdopodobnie dlatego, że książka o tym nie wspomina.

Pojedyncze & są przydatne przy wyliczaniu flagi i maskach bitowych.

Poniższa rzuci wyjątek obj jest zerowy:

bool b = obj != null & obj.IsActive 

Ale to będzie działać:

bool b = obj != null && obj.IsActive 

To jest złe:

bool b = obj.IsActive && obj.SetActive(false); 
bool b = obj.IsActive & obj.SetActive(false); 

Operator & jest tutaj zostać.

Powiązane problemy