Dwa warunki w jednym case (switch)

0

Cześć, mam pytanie, ale czy da się w C++ sprawdzić w jednym case dwa warunki? Wydaje mi się, że kiedyś coś podobnego widziałem na zasadzie:

switch(type){
case warunek1, warunek2:

break;
case warunek3:

break;
}

Ale to nie działa :/ Czy jest inny sposób?

4

Tak:

switch (type) {
  case warunek1:
  case warunek2:
    // ...
    break;
  case warunek3:
    // ...
    break;
}
0

@Endrju dzięki! Rzeczywiście tak to widziałem ;-).
A mam jeszcze pytanie, bo przed chwilą jeszcze na coś takiego wpadłem:

switch(type){

case warunek1 || warunek2:

break;
...
}

I też się kompiluje. Mam więc pytanie czy to jest dokładnie to samo czy są jakieś mniejsze lub większe różnice (np. w wydajności)?

3

To zupełnie inny kod.

W case musi być constant expression. Oznacza to, że wartość musi być znana podczas kompilacji. W wypadku || zostanie po prostu obliczona ta suma logiczna i case będzie miało wartość true albo false (i musi się dać skonwertować na decltype(type)) w zależności od tego co wyjdzie z wyrażenia warunek1 || warunek2.

Czyli np. jeżeli type jest typu int oraz warunek1 == 0 i warunek2 == 7 (i są to stałe znane w czasie kompilacji) to będzie to tak naprawdę case 1:.

0

Dzięki wielkie za wyjaśnienie i pomoc!

0

Witam,
chciałem trochę pociągnąć temat i dopytać: czy taki podwójny case jest leniwy? Tzn. czy jeśli mamy coś w stylu:

switch(zmienna)
{
case 1: case 2:
//rób coś
break;
}

To czy jeśli zmienna == 1 to czy program sprawdzi tylko case 1, czy również case 2: a dopiero wykona dalsze instrukcje?

Innymi słowy czy szybsze nie będzie coś w stylu:

switch(zmienna)
{
case 1:
//...
break;
case 2:
//rób to samo co w case 1
break;
}

Z góry dzięki za odpowiedź.

0

Nie przejmuj się takimi głupotami, nawet jeśli byłyby jakiekolwiek różnice to z całą pewnością są pomijalne. Sama duplikacja kodu już powinna sugerować, że takie rozwiązanie jest złe. Inaczej po co mamy funkcje, skoro można Ctrl+C Ctrl+V kod, a wiemy że wywołanie funkcji zwykle (nie zawsze) coś kosztuje.

0

Ale tu nie ma niczego do sprawdzania więcej niż raz. Jeżeli zmienna będzie miała wartość 1 to wykona się kod w tym case. Jeżeli będzie 2 to też wykona się ten case. "Sprawdzanie" jest zawsze jeden raz, potem wybierany jest case. W skrócie: nie będzie absolutnie żadnej różnicy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1