Instrucțiunea switch
Când o listă de valori fixe se scrie mai bine decât un lanț de if și de ce un break lipsă nu este întotdeauna o greșeală.
Ce rezolvă
Când testezi aceeași variabilă față de mai multe valori fixe, un lanț de else if devine repetitiv:
if (optiune == 1) ...
else if (optiune == 2) ...
else if (optiune == 3) ...Cu switch scrii același lucru mai direct:
switch (optiune) {
case 1:
cout << "adunare";
break;
case 2:
cout << "scădere";
break;
case 3:
cout << "înmulțire";
break;
default:
cout << "opțiune necunoscută";
}Regulile
Expresia din paranteze trebuie să fie întreagă sau caracter. Un switch pe un double sau pe un șir de caractere nu compilează.
Fiecare case este o valoare fixă, nu o condiție. case x > 5: nu există. Dacă ai nevoie de intervale, folosește if.
break iese din switch. Fără el, execuția continuă în cazul următor.
default prinde tot ce nu s-a potrivit. Este opțional, dar aproape întotdeauna îți trebuie.
Căderea prin cazuri
Fără break, execuția „cade" în cazul următor:
switch (c) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
cout << "vocală";
break;
default:
cout << "nu e vocală";
}Aici căderea este intenționată și utilă: toate cele cinci cazuri duc la aceeași instrucțiune. Așa se scrie cel mai curat „una dintre valorile astea".
Când căderea nu este intenționată, apare un bug greu de văzut:
switch (n) {
case 1:
cout << "unu"; // fără break
case 2:
cout << "doi";
break;
}Pentru n = 1 se afișează unudoi. Compilatorul nu semnalează nimic, pentru că în C++ căderea este permisă.
Un exemplu
Se citește un caracter care reprezintă un operator și două numere. Să se afișeze rezultatul operației.
#include <iostream>
using namespace std;
int main() {
char op;
double a, b;
cin >> a >> op >> b;
switch (op) {
case '+': cout << a + b; break;
case '-': cout << a - b; break;
case '*': cout << a * b; break;
case '/':
if (b != 0) cout << a / b;
else cout << "împărțire la zero";
break;
default: cout << "operator necunoscut";
}
return 0;
}Observă cazul '/': un case poate conține orice, inclusiv un if. Verificarea împărțirii la zero e necesară. Fără ea, pentru b = 0 programul ar afișa inf sau nan în loc de un mesaj clar.
switch sau if?
Folosește switch când compari o singură variabilă întreagă sau caracter cu mai multe valori fixe, unde un șir de if-uri ar ieși lung.
Folosește if când ai intervale sau condiții compuse ori compari altceva decât întregi.
În practică, la bac scrii if de zece ori mai des. switch apare mai ales la meniuri și la clasificarea caracterelor.
De reținut
switchmerge doar pe întregi și caractere, cu valori fixe.breakla fiecare caz, altfel execuția cade mai departe.- Căderea intenționată grupează mai multe valori care fac același lucru.
defaultprinde restul. Pune-l aproape întotdeauna.