Perché le lingue non usano il ribaltamento esplicito delle istruzioni switch?

17

Stavo leggendo Perché dobbiamo usare break in switch ? , e mi ha portato a chiedermi il motivo per cui è implicita la ricaduta implicita in alcuni linguaggi (come PHP e JavaScript), mentre non c'è supporto (AFAIK) per l'esplicito fall-through .

Non è come se fosse stata creata una nuova parola chiave, dato che continue sarebbe perfettamente appropriato e risolverebbe qualsiasi problema di ambiguità per stabilire se l'autore intendesse che un caso fallisse.

Il modulo attualmente supportato è:

switch (s) {
    case 1:
        ...
        break;
    case 2:
        ... //ambiguous, was break forgotten?
    case 3:
        ...
        break;
    default:
        ...
        break;
}

Considerando che avrebbe senso essere scritto come:

switch (s) {
    case 1:
        ...
        break;
    case 2:
        ...
        continue; //unambiguous, the author was explicit
    case 3:
        ...
        break;
    default:
        ...
        break;
}

Ai fini di questa domanda, ignoriamo la questione se i fall-through siano o meno un buon stile di codifica.

Esistono dei linguaggi che consentono il fail-through e lo hanno reso esplicito?

Esistono motivi storici per cui switch ammette ricadute implicite anziché esplicite?

    
posta zzzzBov 28.08.2012 - 15:43
fonte

2 risposte

18

È principalmente storico, la maggior parte delle lingue ha appena copiato ciò che ha fatto C.

Il motivo per cui C l'ha fatto in questo modo è che i creatori di C hanno voluto che le dichiarazioni di switch fossero facili da ottimizzare in una tabella di salto. Questo è anche il motivo per cui C limita le istruzioni di commutazione ai valori interi.

In una tabella di salto, il programma calcolerà in quale posizione saltare in base all'espressione. Il programma salterà a quel punto e quindi continuerà ad essere eseguito da quel punto. Se vuoi saltare il resto del tavolo devi includere un salto alla fine del tavolo. C usa esplicite istruzioni break in modo che ci sia una corrispondenza diretta con questo costrutto.

    
risposta data 28.08.2012 - 15:49
fonte
6

Go consente una ricaduta esplicita utilizzando la parola chiave fallthrough (l'interruzione è implicita, ma potrebbe essere esplicita):

switch val {
case 1: // breaks
case 2:
    fallthrough
case 3:
    goto 
case 4, 5, 6: // equivalent to defining individual cases with explicit fallthough
    break // unnecessary
default:
}

Ecco il bit rilevante da efficace go e specifiche della lingua .

Non penso che tu possa utilizzare goto per passare a un caso specifico, ma puoi creare un'etichetta all'interno del caso e utilizzare un goto come normale.

Come bonus, Go ti consente di utilizzare espressioni binarie, stringhe o tipi in un passaggio come istruzioni caso .

    
risposta data 03.04.2013 - 18:39
fonte

Leggi altre domande sui tag