Comutator (programare)

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

În programare, comutatorul , uneori numit și switch-case , este o structură de control care permite verificarea valorii unei expresii.

Este o instrucțiune utilizată în majoritatea limbajelor de programare, al cărei rol este de a distinge mai multe cazuri care corespund la cât mai multe valori ale unei expresii. Este util atunci când trebuie să verificați multe valori pentru o singură variabilă, un context în care este adesea foarte eficient, chiar dacă această afirmație depinde foarte mult de limbă și, prin urmare, de implementarea utilizată.

Structura generală

O expresie, cum ar fi o variabilă, este evaluată și se face o comparație pentru egalitate cu privire la valorile definite de programator. Aceste valori sunt împărțite în cazuri , care sunt specificate folosind cuvântul cheie case . Dacă expresia are o valoare egală cu unul dintre cazurile așteptate, se execută codul corespunzător. În multe limbi, diferitele cazuri pot specifica numai valori constante, nu variabile. [1] [2]

Detaliile sintaxei variază în funcție de limbajul utilizat, dar este posibil să scrieți un pseudocod care să ofere o idee generală:

 COMUTATOR variabil
CASE „1” : cod_1
CAZUL '2' : cod_2
SFÂRȘIT

În general, pentru a putea „capta” condiții neprevăzute în diferite cazuri , se introduce un caz implicit implicit, care este atins dacă toate comparațiile sunt false.

 COMUTATOR variabil
CASE „1” : cod_1
CAZUL '2' : cod_2
DEFAULT : a ajuns la_condiții_de_antecedente_nu_ai
SFÂRȘIT

Exemple clasice

Aceste exemple se referă la unele limbi cu o sintaxă asemănătoare C : deși este conceptual aceeași structură de control, alte limbi o pot implementa foarte diferit. Consultați paragraful următor pentru informații suplimentare.

În limbajele asemănătoare cu C, cum ar fi C ++, C #, Java, PHP și C în sine, este necesar să inserați instrucțiunea break înainte de a scrie următorul caz . În caz de lipsă, de fapt, fluxul de control continuă secvențial cu următoarele instrucțiuni; în acest caz se execută nu numai codul legat de starea verificată, ci și tot codul celorlalte cazuri următoare, până la sfârșitul construcției casei de comutare.

 #include <iostream>
folosind spațiul de nume std ;

int main ()
{
int luna ;
cout << "introduceți numărul lunii" << endl ;
cin >> luna ;

comuta ( luna )
{
cazul 1 :
cout << "Ianuarie" << endl ;
pauză ;
cazul 2 :
cout << "februarie" << endl ;
pauză ;

cazul 3 :
cout << "Martie" << endl ;
pauză ;

cazul 4 :
cout << "April" << endl ;
pauză ;

cazul 5 :
cout << "Mai" << endl ;
pauză ;

cazul 6 :
cout << "iunie" << endl ;
pauză ;

cazul 7 :
cout << "July" << endl ;
pauză ;

cazul 8 :
cout << " august " << endl ;
pauză ;

cazul 9 :
cout << "septembrie" << endl ;
pauză ;

cazul 10 :
cout << "octombrie" << endl ;
pauză ;

cazul 11 :
cout << "noiembrie" << endl ;
pauză ;

cazul 12 :
cout << "Decembrie" << endl ;
pauză ;

implicit :
cout << "puteți alege între 1,2,3,4,5,6,7,8,9,10,11,12." << endl ;
}
retur 0 ;
}

PHP

 $ number = rand ( 1 , 3 );
comutați ( numărul $ )
{
cazul 1 :
ecoul „a ieșit 1” ;
pauză ;

cazul 2 :
ecoul „a ieșit 2” ;
pauză ;

cazul 3 :
ecoul „a ieșit 3” ;
pauză ;
}

Implementare în alte limbi

În timp ce conceptual este aceeași structură de control, codul se poate schimba foarte mult în funcție de limba de referință sau este posibil să nu existe deloc implementare. Unele limbi, cum ar fi Python , de fapt, nu contemplă deloc construcția casei de comutare .

Citând alte exemple, Perl l-a introdus din versiunea 5.10 cu declarația dată sau, alternativ, prin modulul Switch, descărcabil de pe CPAN . [3] Limbajul Ruby se bazează pe declarația de caz [4] pentru a implementa această structură, ca în exemplul următor.

Rubin

 Line input case

când "depanare"
tipăriți „Depanare”

când / p \ s + (\ w +) /
dumpVariable ( $ 1 )

când „renunță” , „ieși”
Ieșire

altceva
print "Comandă: # { inputLine } "
Sfârșit

Comparație cu if-else

Switch-case-ul este o structură de control care este, în multe feluri, similară cu construcția if-else . Acest lucru poate duce la greșeala obișnuită de a le considera redundante, în timp ce în realitate există diferențe importante.

Fiecare limbă are propriile sale caracteristici, iar acest lucru se reflectă și în implementarea diferitelor constructe. Ceea ce este adevărat pentru o limbă poate să nu fie corect pentru alta.

Principalele diferențe între caz-comutare și if-else

Puteți vedea o comparație cu principalele caracteristici ale celor două constructe:

  1. În construcția if-else, programatorul scrie explicit o expresie logică, care îi specifică starea . În construcția casei de comutare, nu sunt scrise condiții: implicit, condițiile verificate sunt date de comparația care se face pentru a verifica egalitatea dintre expresia indicată și fiecare dintre diferitele constante corespunzătoare cazurilor.
  2. Ca o consecință a diferenței de mai sus, constructul if-else (care are o singură condiție) poate alege doar între două acțiuni diferite, corespunzătoare condiției adevărate și respectiv false. Construcția casei de comutare (care are atât de multe condiții cât sunt N cazuri) poate alege între N +1 acțiuni diferite, una pentru fiecare caz și, eventual, una în mod implicit.
  3. În multe limbi în care această construcție este implementată în modul „clasic” (cu sintaxă asemănătoare cu C), este necesar să încheiem fiecare caz cu o pauză. Dacă nu faceți acest lucru, puteți rula codul nedorit.
  4. În multe condiții de verificat, utilizarea construcției casei de comutare poate duce la un câștig ușor de performanță, datorită posibilelor optimizări ale compilatorului. [5] [6] [7] Este posibil ca acest lucru să nu fie întotdeauna adevărat, mai ales în limbile de scriptare . [8] În toate cazurile, creșterea performanței nu este decisivă de cele mai multe ori.
  5. În multe implementări, constructul casei de comutare necesită valori constante. În declarațiile if-else, această limită nu există. Acest lucru nu este adevărat în multe limbaje de script interpretate , datorită tastării dinamice care face posibilă utilizarea și a altor elemente. Exemplul de mai sus din Ruby este un exemplu.

Notă

  1. ^ De ce nu pot avea o variabilă în declarația switch-case? , la stackoverflow.com . Adus pe 9 octombrie 2015 .
  2. ^ Folosind variabila pentru declarația de caz de schimbare , la stackoverflow.com . Adus pe 9 octombrie 2015 .
  3. ^ perlsyn - perldoc.perl.org , pe perldoc.perl.org . Adus pe 9 octombrie 2015 .
  4. ^ Cum pot scrie o declarație switch în Ruby? , la stackoverflow.com . Adus pe 9 octombrie 2015 .
  5. ^ Este „comutator” mai rapid decât „dacă”? , la stackoverflow.com . Adus pe 9 octombrie 2015 .
  6. ^ Este „else if” mai rapid decât „switch () case”? , la stackoverflow.com . Adus pe 9 octombrie 2015 .
  7. ^ De ce comutarea este mai rapidă decât dacă , la stackoverflow.com . Adus pe 9 octombrie 2015 .
  8. ^ Ruby Performance: Case vs. If-elsif - Midwire , la midwire.github.io . Adus pe 9 octombrie 2015 .

linkuri externe

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT