Perché i casi in un'istruzione switch non sono isolati? [duplicare]

3

Per quanto posso dire in tutti i linguaggi C-like qualcosa del genere:

switch(variable) {
    case 'a':
        printf("Hello ");
    case 'b':
        printf("World!");
    case 'c':
        printf("\n");
}

Stampa "Hello World!" se variabile == 'a'. Sono curioso del ragionamento alla base di questo comportamento, in quanto mi sembra che l'inserimento automatico di interruzioni alla fine di ogni caso renderebbe il suo comportamento molto più coerente con le aspettative e molto meno soggetto a errori.

Ad esempio: "Nel caso in cui il tuo dado tiri un 6, pesca un'altra carta" è un'azione che deve essere eseguita in un singolo caso, il che implica che la parola chiave del caso implichi.

    
posta Bartvbl 17.02.2015 - 18:34
fonte

4 risposte

11

Per scrivere l'equivalente di un'istruzione switch in assembly, è necessario aggiungere salti alla fine di ogni ramo per impedire che l'esecuzione continui al ramo successivo. C è stato progettato per avere una mappatura abbastanza semplice al codice macchina, e il modello sarebbe stato familiare ai programmatori di assemblaggio in quel momento.

I suoi discendenti probabilmente l'hanno tenuto fuori dall'inerzia storica, che non dovrebbe essere sottovalutato. Ad esempio, i progettisti di C # sentivano chiaramente che la ricaduta accidentale è una fonte importante di bug ed è un caso raro, quindi devi esplicitamente cadere se lo vuoi, ma loro sono ancora ha mantenuto la sintassi dell'aggiunta di break alla fine!

    
risposta data 17.02.2015 - 18:43
fonte
5

Questo perché non è possibile presumere che la logica e il flusso del programma dovrebbero interrompersi dopo una singola corrispondenza. È un buon design per un tipo di test condizionale per più corrispondenze.

Prendi questo ad esempio:

switch (shape)
{
    case Square:
        printf("I am a square\r\n");
    case Rectangle:
        printf("I am a rectangle\r\n");
        break;
    case Circle:
        printf("I am a circle\r\n");
        break;
}

Se non avessimo il comportamento fall in qui, dovremmo essere ridondanti con printf("I am a rectangle\r\n"); per poter eseguire quel codice sia per un quadrato che per un rettangolo.

    
risposta data 17.02.2015 - 18:40
fonte
4

L'affermazione di un caso fallito è raramente necessaria, ma a volte capita. (Ho sentito dire che C era stato originariamente concepito per programmare i centralini telefonici, in cui questo bisogno sorge spesso, ma non sono stato in grado di confermarlo.) Ma la verità è che anche nel software moderno, la necessità di una dichiarazione di un caso fallisce ogni tanto in un tempo raro.

Se il linguaggio C non consentiva l'inversione dell'istruzione del caso, sarebbero necessari soluzioni alternative, ma la linea di pensiero del 1972 era di evitare sprechi di cicli di clock. Consentendo la ricapitolazione dell'affermazione del caso, i programmatori potrebbero averlo in entrambi i modi: potresti cadere o interrompere, a seconda di quale fosse pertinente alle tue esigenze, caso per caso.

L'obiettivo principale del linguaggio C in origine era quello di essere gentile con la macchina, non piacevole per i programmatori. L'originale C era snello, meschino e molto spietato.

L'idea alla base della prevenzione dell'affermazione del caso è un concetto molto moderno, che riguarda la protezione dei programmatori da se stessi. Pochissime persone stavano pensando in tal senso in AT & T Bell Labs nel lontano 1972, quando fu inventato C.

    
risposta data 17.02.2015 - 19:49
fonte
0

Vedi Overflow dello stack .

Una sommatoria degli argomenti popolari presentati è la seguente:

  1. Un'istruzione switch può fornire risultati pluriennali pur consentendo di avere una scelta a riguardo con la clausola break.
  2. È stato un errore nel design di C che ha finito per diventare lo standard per le dichiarazioni del caso.
risposta data 17.02.2015 - 18:43
fonte

Leggi altre domande sui tag