switch în C

Alege una din mai multe ramuri după valoarea unui întreg, cu etichete case; fără break, execuția continuă în ramura următoare.

Sintaxă
switch (expresie_intreaga) {
    case CONSTANTA1:
        ...
        break;
    case CONSTANTA2:
    case CONSTANTA3:
        ...
        break;
    default:
        ...
}

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": sau case x: cu o variabilă. Etichetele trebuie să fie constante întregi; pentru șiruri folosește if cu strcmp.
  • Declari o variabilă direct după case și o folosești în alt case. 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.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: switch

Ai o nelămurire despre utilizarea comenzii switch sau 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.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.