2010-01-24 11 views
5

ja po prostu nie rozumiem, jak używać operatora logiczną wewnątrz instrukcji switchJak używać operatora boolean w instrukcji case?

switch (expression) { 
     case > 20: 
      statements 
      break; 
     case < -20: 
      statements 
      break; 
    } 

Edytuj:
Nie chcę if() oświadczenie.

+0

brak zachowania przy wyrażeniu == 20? –

+0

Nie, tylko dlatego, że instrukcje case są łatwiejsze do odczytania i są szybsze niż instrukcje If(). Nie chcę żadnego zachowania, gdy 'wyrażenie == 20'. – Jaba

+1

Są szybsze, ponieważ są mniej wydajne. Musisz porównać ze stałymi wartościami, po jednej na raz. Nie możesz wyrazić tego, co pokazałeś, używając instrukcji 'switch'. – zneak

Odpowiedz

5
switch ((expression) > 20) { 
     case true: 
      statements 
      break; 
     case false: 
     default: 
      statements 
      break; 
    } 

Co .. chcesz więcej niż 1 boolean w przypadku? Można to zrobić

int ii = ((expression) > 20) + 2 * ((expression) < -20); 
switch (ii) { 
     case 1: 
      statements 
      break; 
     case 2: 
      statements 
      break; 
    } 

to IMO jest całkiem zły kod, ale to jest to, co prosiłeś ...

Wystarczy użyć if, będziesz lepiej w dłuższej perspektywie.

+0

Chciałbym przypomnieć, że jest to głównie porównanie, które sprawia, że ​​'if' wolniej niż' switch'es, i w konsekwencji nie pomoże to w szybszym kodzie. – zneak

+0

w rzeczywistości to nieprawda. to BRANCH powoduje spowolnienie, a nie porównanie. Ale przełącznik nadal jest gałęzią. –

+0

Spóźniam się o rok, ale na wypadek, gdyby ktoś natknął się na tę odpowiedź, miałem na myśli to, że podczas gdy oba 'if' i' switch' powodują gałąź (i jest to najwolniejsza część), co powoduje, że 'if/else if 'pary wolniejsze niż polecenie' switch' są takie, że wykonują jedno porównanie na warunek. Z drugiej strony "przełącznik" jest zwykle implementowany za pomocą sprytnych sztuczek, które umożliwiają całkowite unikanie porównań, bez względu na to, ile ma to "przypadków". – zneak

10

Nie możesz. Użyj if() ... else ....

Najbliższa dostępna funkcja zawiera rozszerzenie GCC i dlatego jest niestandardowa. Można zdefiniować zakresy w sprawozdaniach przypadku zamiast tylko wartości:

switch(foo) 
{ 
    case 0 ... 20: // matches when foo is inclusively comprised within 0 and 20 
     // do cool stuff 
     break; 
} 

Jednak nie można używać, aby dopasować nic poniżej pewnej wartości. Musi być w dokładnym zakresie. Switch es można użyć tylko do zastąpienia operatora porównania względem stałej i nie można go użyć do niczego więcej.

+0

Niestety, prędkość jest kosztem elastyczności i nie ma możliwości użycia operatora boolowskiego zamiast przełącznika. Jest szybszy, ponieważ procesor ma mniej pracy do wykonania. Gdybyś mógł użyć operatora boolowskiego wewnątrz 'switch', nie byłoby powodu, dla którego' if' byłby wolniejszy niż instrukcje 'switch'. – zneak

+0

Co się dzieje, gdy mam więcej niż 5 przypadków? – Jaba

+0

Cóż, to tylko moja zasada kciuka i nie chciałem, aby wyglądało to na taką absolutną regułę. Robisz, co chcesz w tym przypadku. Zamierzam to edytować. – zneak

Powiązane problemy