Instrucțiunea switch

Deși în teoria programării structurate se demonstrează că, pentru a realiza programe cu structură ramificată, este suficient să se folosească structura de control alternativă, realizată în limbajul Java prin instrucțiunea  if..else, în practica programării se admit și structuri de comutare sau de selecție, care sunt prezente in diferite limbaje de programare. Aceste structuri permit să se aleagă una din mai multe ramuri paralele,alegerea  depinzând de valoarea unei expresii numită comutator sau selector. În același timp, ele respectă principiul de bază al programării structurate, conform căruia fiecare structură de control trebuie să aibă un singur punct de intrare și un singur punct de ieșire, astfel că se încadrează în această metodă de elaborare a programelor.
În limbajul Java, structura de comutare se realizează prin instrucțiunea switch, care are următoarea formă generală:

    switch (expresie) {
      case valoare_1: secvență_1
                    [break;]
      case valoare_2: secvență_2
                    [break;]
      ..........................
      case valoare_N: secvență_N
     [default: secvență ]
    }

în care:
   - switch, case si  default sunt cuvinte cheie ale limbajului Java;
   - expresie este o expresie de tip byte, short, int sau char;
   - valoare este fie un literal de tip byte, short, int sau char, fie o expresie constantă de tip int, adică o expresie care conține numai literali sau variabile finale din tipurile menționate;
   - secvențaeste o secvență de instrucțiuni simple sau structurate;
   - parantezele drepte roșii []nu apar în program, ci indică faptul că conținutul lor este opțional (poate sa lipsească).

În limba engleză, switch înseamnă comutator. Conform acestei forme generale, după cuvantul cheie  switch, există o expresie de tip  int sau compatibilă cu aceasta (deci poate fi și de tip  char, byte sau  short, dar nu de tip long), a cărei valoare servește drept "comutator". Se deschide apoi acolada corpului instrucțiunii, în care există mai multe "cazuri". Fiecare "caz" începe prin cuvantul cheie case, urmat de o valoare de tip întreg, după care apar una sau mai multe instrucțiuni (simple sau compuse) și opțional intrucțiunea   break. După ce s-au epuizat toate cazurile, opțional se poate scrie cuvântul cheie  default urmat de una sau mai multe instrucțiuni. La sfârșit,  se închide acolada corpului instrucțiunii switch.

Executarea instrucțiunii  switch decurge astfel: se evaluează mai întâi expresie și se obține o valoare de tip întreg, care servește drept comutator. Această valoare se compară, pe rând de sus în jos, cu fiecare din valorile indicate după cuvintele cheie  case, până când se găsește prima  valoare care coincide cu cea a comutatorului. Dacă s-a găsit o astfel de valoare, se execută toate instrucțiunile care încep de la cazul respectiv, până la prima instrucțiune  break întalnită sau, în lipsa acesteia, până la acolada de închidere a corpului instrucțiunii  switch.  Dacă însă nici unul din cazuri nu conține valoarea potrivită a comutatorului, atunci se execută instrucțiunile care urmează după cuvântul cheie default sau, în lipsa acestuia, nu se execută nimic.

Exemplu
În fișierul TestSwitch.java se dă programul de mai jos, în care se testează instrucțiunea switch în două situații: în primul caz nu este utilizată instrucțiunea break, iar în al doilea caz este pusă această instrucțiune la sfârșitul secvenței de instrucțiuni corespunzătoare fiecărui caz. Remarcăm, de asemenea, că în al doilea caz, întrucât comutatorul este de tip char, valorile numerice corespunzătoare fiecărui caz au trebuit să se încadreze în acest tip, adică să fie caractere sau numere întregi pozitive în intervalul [0, 65535].
 
/* Testarea instructiunii switch */

class TestSwitch {
  public static void main(String args[]) {
    int a=7;
    char c='@';
    double u=15.3782;
    System.out.println("Switch fara break si cu cazuri vide");
    switch(a) {
      case 143: u++;
                System.out.println("A "+u);
      case 2:   u+=a;
                System.out.println("B "+u);
      case 7:   u--;
                System.out.println("C "+u);
      case '@':
      case 148:
      case 15:
      case -87: u-=a;
                System.out.println("D "+u);
      case -12: u*=a;
                System.out.println("E "+u);
      case 'F': u%=a;
                System.out.println("F "+u);
      default:  u=15.3782;
                System.out.println("G "+u);
    }
                System.out.println("Switch cu break dupa fiecare caz nevid");
    switch(c) {
      case 143: u++;
                System.out.println("A "+u);
                break;
      case 2:   u+=a;
                System.out.println("B "+u);
                break;
      case 7:   u--;
                System.out.println("C "+u);
                break;
      case '@':
      case 148:
      case 15:
      case 87:  u-=a;
                System.out.println("D "+u);
                break;
      case 12:  u*=a;
                System.out.println("E "+u);
                break;
      case 'F': u%=a;
                System.out.println("F "+u);
                break;
      default:  u=15.3782;
                System.out.println("G "+u);
    }

  }
}

Rezultatul rulării acestui program este următorul:
 
Switch fara break si cu cazuri vide
C 14.3782
D 7.3782
E 51.6474
F 2.6473999999999975
G 15.3782
Switch cu break dupa fiecare caz nevid
D 8.3782

Se observă cu ușurință că, în primul caz (fără instrucțiuni break), s-a început executarea secvenței de instrucțiuni în punctul "case 7" și s-a continuat până la sfârșitul blocului instrucțiunii switch (inclusiv cazul default). Când s-a folosit instrucțiunea break, ieșirea s-a făcut la întalnirea acestei instrucțiuni.



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați