Ce face switch
switch calculează o expresie întreagă (sau un caracter, sau un enum) și sare la eticheta case cu aceeași valoare. Dacă nu se potrivește niciuna, sare la default, dacă există.
Etichetele trebuie să fie constante cunoscute la compilare: numere, caractere, valori enum, constexpr din C23. Nu poți folosi șiruri de caractere sau intervale.
După ce sare la un case, execuția continuă în jos până la break sau până la finalul lui switch. Asta permite gruparea mai multor valori pe aceeași ramură, dar și greșeli când uiți break. Dacă vrei intenționat să treci în ramura următoare, C23 are atributul [[fallthrough]];.
Exemple
Exemplul 1: Ziua săptămânii
#include <stdio.h>
const char *nume_zi(int zi) {
switch (zi) {
case 1: return "luni";
case 2: return "marți";
case 3: return "miercuri";
case 4: return "joi";
case 5: return "vineri";
case 6: return "sâmbătă";
case 7: return "duminică";
default: return "zi invalidă";
}
}
int main(void) {
printf("%s, %s, %s\n", nume_zi(1), nume_zi(6), nume_zi(9));
return 0;
}
Rezultat
luni, sâmbătă, zi invalidă
Exemplul 2: Mai multe valori pe aceeași ramură
Etichetele scrise una după alta, fără instrucțiuni între ele, duc la același cod.
#include <stdio.h>
int main(void) {
const char *text = "Ana are 3 mere";
int vocale = 0, cifre = 0;
for (int i = 0; text[i] != '\0'; i++) {
switch (text[i]) {
case 'a': case 'e': case 'i': case 'o': case 'u':
case 'A': case 'E': case 'I': case 'O': case 'U':
vocale++;
break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
cifre++;
break;
default:
break;
}
}
printf("vocale: %d, cifre: %d\n", vocale, cifre);
return 0;
}
Rezultat
vocale: 6, cifre: 1
Exemplul 3: Trecere intenționată cu [[fallthrough]]
Abonamentul Premium include tot ce are Standard, iar Standard include tot ce are Gratuit. [[fallthrough]]; spune compilatorului și cititorului că lipsa lui break este voită.
#include <stdio.h>
enum Plan { GRATUIT, STANDARD, PREMIUM };
void beneficii(enum Plan p) {
switch (p) {
case PREMIUM:
printf(" - filme 4K\n");
[[fallthrough]];
case STANDARD:
printf(" - fără reclame\n");
[[fallthrough]];
case GRATUIT:
printf(" - catalog de bază\n");
break;
}
}
int main(void) {
printf("Standard:\n");
beneficii(STANDARD);
printf("Premium:\n");
beneficii(PREMIUM);
return 0;
}
Rezultat
Standard:
- fără reclame
- catalog de bază
Premium:
- filme 4K
- fără reclame
- catalog de bază
Greșeli frecvente
- Uiți
break. Execuția continuă în ramura următoare și rulează cod pe care nu îl voiai. - Încerci
case "Iasi":saucase x:cu o variabilă. Etichetele trebuie să fie constante întregi; pentru șiruri foloseșteifcustrcmp. - Declari o variabilă direct după
caseși o folosești în altcase. Pune corpul ramurii între acolade:case 1: { int x = 5; ... break; }.
Comenzi înrudite
if / else: Execută un bloc de cod doar dacă o condiție este adevărată, cu ramuri alternative pentru celelalte cazuri.enum: Definește un set de constante întregi cu nume, de exemplu zilele săptămânii sau stările unei comenzi.break, continue și goto: break iese din buclă, continue trece la repetarea următoare, iar goto sare la o etichetă, folosit în C mai ales pentru curățenie la erori.Atribute [[...]]: Atributele C23 dau compilatorului informații în plus: rezultat care nu trebuie ignorat, funcție învechită, variabilă poate nefolosită.constexpr: Declară o constantă cu valoare calculată la compilare, cu tip, care poate fi folosită ca dimensiune de tablou sau în static_assert.
Întrebări & Exemple de Cod:
switchAi o nelămurire despre utilizarea comenzii
switchsau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.