2011-12-27 8 views
11

Czy mogę użyć obudowy przełącznika do sprawdzenia wielu warunków? na przykład, czy spełniony warunek spełni swoje zadanie?Wiele warunków w obudowie przełącznika?

switch (conditionA or conditionB fullfilled) 
    { //execute code } 
+4

jaka będzie przewaga przełącznika * nad normalnym * jeśli *? czy możesz podać przykład tego, co byś zrobił, gdyby to było możliwe? –

+0

Ok Tak naprawdę chcę, aby mój robot ruszył do przodu, gdy kliknięto przycisk 1 lub 2. Ale w jakiś sposób pozostałe przyciski będą podążały za wcześniejszym kierunkiem wcześniej wykonanym. – user982209

Odpowiedz

14

nr C++ przełączyć przypadek może być używana tylko do sprawdzania wartości jednej zmiennej do równości:

switch (var) { 
    case value1: /* ... */ break; 
    case value2: /* ... */ break; 
    /* ... */ 
} 

ale można skorzystać z wielu przełączników:

switch (var1) { 
    case value1_1: 
     switch (var2) { 
      /* ... */ 
     } 
     break; 
    /* ... */ 
} 
19

Oczywiście, kwestia sposobu na wykonanie kodu, jeśli albo conditionA lub conditionB jest true można trywialnie odpowiedział if(conditionA || conditionB) nie switch oświadczenie konieczne. A jeśli oświadczenie switch jest z jakiegoś powodu koniecznością, to na pytanie można ponownie odpowiedzieć trywialnie, sugerując, że etykieta o numerze case przewraca się, tak jak w przypadku jednej z pozostałych odpowiedzi.

Nie wiem, czy potrzeby PO są w pełni objęte tymi trywialnymi odpowiedziami, ale to pytanie będzie czytane przez wiele osób poza OP, więc chciałbym przedstawić bardziej ogólne rozwiązanie, które może rozwiązać wiele podobnych problemy, na które trywialne odpowiedzi po prostu się nie sprawdzą.

Sposób użycia pojedynczej instrukcji switch do równoczesnego sprawdzania wartości dowolnej liczby warunków logicznych.

To jest hacky, ale może się przydać.

Sztuką jest do konwersji wartości true/false każdego ze swoich warunków do kawałka, złączyć te bity do wartości int, a następnie switch od wartości int.

Oto przykładowy kod:

#define A_BIT (1 << 0) 
#define B_BIT (1 << 1) 
#define C_BIT (1 << 2) 

switch((conditionA? A_BIT : 0) | (conditionB? B_BIT : 0) | (conditionC? C_BIT : 0)) 
{ 
    case 0:      //none of the conditions holds true. 
    case A_BIT:     //condition A is true, everything else is false. 
    case B_BIT:     //condition B is true, everything else is false. 
    case A_BIT + B_BIT:   //conditions A and B are true, C is false. 
    case C_BIT:     //condition C is true, everything else is false. 
    case A_BIT + C_BIT:   //conditions A and C are true, B is false. 
    case B_BIT + C_BIT:   //conditions B and C are true, A is false. 
    case A_BIT + B_BIT + C_BIT: //all conditions are true. 
    default: assert(FALSE); //something went wrong with the bits. 
} 

Następnie można użyć case etykieta spadać przez jeśli masz albo-albo scenariusze. Na przykład:

switch((conditionA? A_BIT : 0) | (conditionB? B_BIT : 0) | (conditionC? C_BIT : 0)) 
{ 
    case 0: 
     //none of the conditions is true. 
     break; 
    case A_BIT: 
    case B_BIT: 
    case A_BIT + B_BIT: 
     //(either conditionA or conditionB is true,) and conditionC is false. 
     break; 
    case C_BIT: 
     //condition C is true, everything else is false. 
     break; 
    case A_BIT + C_BIT: 
    case B_BIT + C_BIT: 
    case A_BIT + B_BIT + C_BIT: 
     //(either conditionA or conditionB is true,) and conditionC is true. 
     break; 
    default: assert(FALSE); //something went wrong with the bits. 
} 

.

8

Co o upadku-through cecha konstrukcji switch/case?

switch(condition){ 
    case case1: 
     // do action for case1 
     break; 
    case case2: 
    case case3: 
     // do common action for cases 2 and 3 
     break; 
    default: 
     break; 
} 
2

W odpowiedzi na Twój komentarz: Ok faktycznie chcę moja robota do przodu, gdy albo przycisk 1 lub 2 kliknięcia. Ale w jakiś sposób pozostałe przyciski będą podążały za wcześniejszym kierunkiem wcześniej wykonanym.

Można po prostu połączyć wszystko razem, niezależnie od tego, czy kliknięto pierwszy przycisk, czy drugi przycisk jest kliknięty, a następnie użyć pojedynczego przełącznika lub instrukcji.

Powiązane problemy