Switch (programmazione)

Da Wikipedia, l'enciclopedia libera.

In programmazione lo switch, chiamato a volte anche switch-case, è una struttura di controllo che permette la verifica del valore di una variabile.

Si tratta di un'istruzione usata in gran parte dei linguaggi di programmazione, ed ha il compito di poter "gestire" più casi del valore di una variabile. Risulta utile quando si devono controllare tanti valori per una singola variabile, contesto dove spesso è molto efficiente, anche se questa affermazione dipende molto dal linguaggio, e quindi anche dalla implementazione usata.

Struttura generale[modifica | modifica wikitesto]

La variabile viene controllata confrontandola con condizioni definite dal programmatore, in modo simile a quanto accade per il costrutto if-else. Tali condizioni sono suddivisi in casi, che vengono specificati utilizzando la parola chiave case. In molti linguaggi, i vari casi possono specificare solamente valori costanti. Per ragioni di efficienza, i casi con cui confrontare la variabile non possono essere altre variabili.[1][2]

L'implementazione varia in base al linguaggio usato, ma è possibile scrivere uno pseudocodice che dia un'idea generale:

SWITCH variabile
     CASE '1': codice_1
     CASE '2': codice_2
END

In genere, per poter "catturare" condizioni non previste nei vari case, è inserito un caso predefinito default che viene raggiunto se tutte le altre condizioni si sono rivelate false.

SWITCH variabile
     CASE '1': codice_1
     CASE '2': codice_2
     DEFAULT: raggiunto_se_condizioni_precedenti_non_vere
END

Esempi classici[modifica | modifica wikitesto]

Questi esempi sono relativi ad alcuni linguaggi con una sintassi simile al C: sebbene sia concettualmente la stessa struttura di controllo, altri linguaggi possono implementarla in modo molto diverso. Si veda il paragrafo successivo per approfondimenti.

Nei linguaggi C-like, come possono essere C++, C#, Java, PHP e lo stesso C, è necessario inserire l'istruzione break prima di scrivere il successivo case. In caso di mancanza, infatti, non verrebbe eseguito solo il codice relativo alla condizione verificata, ma anche tutto il codice delle altre condizioni, fino al termine del costrutto switch-case.

C++[modifica | modifica wikitesto]

switch(numero)
{
    case 1:
        cout<<"1"<<endl;
        break;
        //Se questo break non ci fosse, verrebbero eseguiti anche i codici di "case 2", "case 3" e l'eventuale "default"

    case 2:
        cout<<"2"<<endl;
        break;

    case 3:
        cout<<"3"<<endl;
        break;

    default: //opzionale
        cout<<"Altro numero."<<endl;
}

PHP[modifica | modifica wikitesto]

$numero = rand(1,3);
switch ($numero)
{
    case 1:
        echo "è uscito 1";
        break;

    case 2:
        echo "è uscito 2";
        break;

    case 3:
        echo "è uscito 3";
        break;
}

Implementazione in altri linguaggi[modifica | modifica wikitesto]

Pur essendo concettualmente la stessa struttura di controllo, il codice può cambiare di molto in base al linguaggio di riferimento, o può non esserci affatto una qualche implementazione. Alcuni linguaggi come ad esempio il Python, infatti, non contemplano affatto il costrutto switch-case.

Citando altri esempi, il Perl lo ha introdotto dalla versione 5.10 con l'istruzione given, o in alternativa tramite il modulo Switch scaricabile da CPAN.[3] Il linguaggio Ruby, per implementare questa struttura, si affida all'istruzione case[4], come nell'esempio che segue.

Ruby[modifica | modifica wikitesto]

case inputLine

  when "debug"
    print "Debug"

  when /p\s+(\w+)/
    dumpVariable($1)

  when "quit", "exit"
    exit

  else
    print "Command: #{inputLine}"
end

Confronto con if-else[modifica | modifica wikitesto]

Lo switch-case è una struttura di controllo che risulta, per molti versi, simile al costrutto if-else. Questo può condurre al comune errore di considerarli ridondanti, mentre in realtà vi sono piccole ma importanti differenze.

Ogni linguaggio ha le proprie caratteristiche, e questo si riflette anche sull'implementazione dei vari costrutti. Ciò che è vero per un linguaggio, può non essere corretto per un altro.

Differenze principali fra switch-case ed if-else.[modifica | modifica wikitesto]

Si può vedere un confronto sulle caratteristiche principali dei due costrutti:

  1. In molti linguaggi dove questo costrutto è implementato nel modo "classico" (con la sintassi C-like), è necessario terminare ogni case con un break. Non farlo, può significare eseguire codice non voluto.
  2. In presenza di molte condizioni da verificare, usare il costrutto switch-case può portare ad un leggero guadagno di performance, a causa di possibili ottimizzazioni del compilatore.[5][6][7] Questo può non essere sempre vero, soprattutto in linguaggi di scripting.[8] In tutti i casi, gli aumenti di prestazioni il più delle volte non sono determinanti.
  3. In molte implementazioni, il costrutto switch-case richiede valori costanti. Nelle istruzioni if-else, questo limite non esiste. Questo non è vero in molti linguaggi di scripting interpretati, a causa della tipizzazione dinamica che rende possibile utilizzare anche altri elementi. L'esempio soprastante in Ruby è un esempio.

Note[modifica | modifica wikitesto]

  1. ^ Why can't I have a variable in switch-case statement?, su stackoverflow.com. URL consultato il 09 ottobre 2015.
  2. ^ Using variable for switch case statement, su stackoverflow.com. URL consultato il 09 ottobre 2015.
  3. ^ perlsyn - perldoc.perl.org, su perldoc.perl.org. URL consultato il 09 ottobre 2015.
  4. ^ How can I write a switch statement in Ruby?, su stackoverflow.com. URL consultato il 09 ottobre 2015.
  5. ^ Is 'switch' faster than 'if'?, su stackoverflow.com. URL consultato il 09 ottobre 2015.
  6. ^ Is "else if" faster than "switch() case"?, su stackoverflow.com. URL consultato il 09 ottobre 2015.
  7. ^ Why switch is faster than if, su stackoverflow.com. URL consultato il 09 ottobre 2015.
  8. ^ Ruby Performance : Case vs. If-elsif - Midwire, su midwire.github.io. URL consultato il 09 ottobre 2015.

Collegamenti esterni[modifica | modifica wikitesto]