Dwa warunki w jednym case (switch)

Odpowiedz Nowy wątek
2014-12-13 02:34
Biały Mleczarz
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?

Pozostało 580 znaków

2014-12-13 02:45

Tak:

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

"(...) otherwise, the behavior is undefined".
edytowany 2x, ostatnio: Endrju, 2014-12-13 02:49

Pozostało 580 znaków

2014-12-13 03:02
Biały Mleczarz
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)?

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26

Pozostało 580 znaków

2014-12-13 03:07
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:.


"(...) otherwise, the behavior is undefined".
edytowany 5x, ostatnio: Endrju, 2014-12-13 03:14

Pozostało 580 znaków

2014-12-13 03:22
Biały Mleczarz
0

Dzięki wielkie za wyjaśnienie i pomoc!

Pozostało 580 znaków

2015-01-20 14:51
Czarny Mleczarz
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ź.

Pozostało 580 znaków

2015-01-20 15:01
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.

Pozostało 580 znaków

2015-01-20 18:17
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.


"(...) otherwise, the behavior is undefined".
edytowany 1x, ostatnio: Endrju, 2015-01-20 18:18

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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