L'uscita singola della funzione utilizza goto

-2

A proposito di a che tipo di bug portano le istruzioni "goto"? Ci sono esempi storicamente significativi? Non sono quello che ho imparato in C, e per me l'enigma è che una singola uscita di una funzione è obbligatoria, ma un goto è considerato negativo. Spesso si deve uscire da una funzione in una condizione di errore e quindi utilizzare un goto al punto di uscita. Inoltre, mi piace usare i protothread. Non è una forma di goto?

    
posta user3824211 28.10.2016 - 05:46
fonte

2 risposte

3

Le lingue sono piene di gotos. L'unica cosa è che sono stati sottratti per renderli più sicuri. Una funzione con un valore di ritorno è un goto astratto, un ciclo while è un goto astratto, ogni istruzione condizionale è un goto astratto.

Dai un'occhiata allo stack della CPU e vedrai molte istruzioni jmp, che in realtà sono gotos.

In breve: sono ancora lì, ma sono astratti per renderli più sicuri da usare.

    
risposta data 28.10.2016 - 10:17
fonte
0

Se diamo un'occhiata al protothread vediamo che la macro non sta creando un goto ma usando un'istruzione switch-case. Quindi i protothread non sono goto.

Il protothread crea più punti di uscita. Un singolo punto di uscita di una funzione non è obbligatorio, ma è una buona regola pratica che quando la funzione richiede più punti di uscita o molte indentazioni, si può presumere che la funzione che hai scritto sia troppo grande. Devi considerare entrambi perché puoi evitare il rientro usando molti punti di uscita o puoi avere un punto di uscita scrivendo complesse istruzioni if, cicli e usando gotos. Nessuno di questi è buono.

Il motivo per cui goto è negativo non è dovuto ai punti di uscita. Se diamo un'occhiata al ciclo while o for vediamo che tutti i ponticelli di cui stiamo parlando stanno eliminando le mani del programmatore. Se lo si desidera o meno, il programmatore non ha il controllo su questi ponticelli nascosti, viene posizionato e indicizzato dinamicamente per il programmatore durante la compilazione. Se diamo un'occhiata a un'istruzione if, che è un'istruzione jump ahead, vedremo la stessa cosa. In nessuna parte del codice c'è un goto definito dal programmatore ma creato dalla lingua. Questo è il motivo principale per cui i goto sono considerati dannosi. Gotos sta rompendo il design del linguaggio di programmazione con la possibilità di interrompere il programma pur sapendo che il linguaggio di programmazione è progettato per occuparsene in modo impeccabile.

    
risposta data 14.11.2016 - 23:47
fonte

Leggi altre domande sui tag