Questa domanda è a rischio di essere un duplicato di Sono 'break 'e' continua 'cattive pratiche di programmazione? ma proverò a dare una spiegazione più teorica.
Ho dimenticato il riferimento ma sarei grato se qualcuno lo trovasse e saremo lieti di includerlo qui, oppure puoi modificare la mia risposta senza chiedere se hai i rappresentanti.
La spiegazione teorica è stata originariamente fornita per supportare alcuni uso limitato di goto , e la giustificazione a questi usi limitati ha dato origine alle dichiarazioni di flusso di controllo strutturate che abbiamo familiarità oggi.
La giustificazione è questa. Esegui il seguente esercizio su carta:
- Ai fini di questo esercizio, considera tutti i trasferimenti di controllo (sia incondizionati che condizionali) come
goto
.
- Elenca il codice del programma per una singola funzione. Se si desidera analizzare più di una funzione, incorporarla nella funzione di primo livello.
- Disegna frecce per connettere ogni
goto
alla destinazione del ramo.
- Metti tutte le frecce di diramazione a ritroso (verso l'alto) a sinistra dell'elenco del programma.
- Metti tutte le frecce dirette in avanti (verso il basso) a destra dell'elenco del programma.
- Se riesci a trovare un modo per sistemare quelle frecce senza incrociarsi tra loro due, il tuo codice si dice abbia una struttura di trasferimento del controllo ragionevole.
(La terminologia usata qui potrebbe essere diversa dal riferimento originale.)
Ora esaminiamo le due parole chiave interrogate: break
e continue
.
Suppongo che tu stia facendo riferimento al loro uso all'interno dei loop. Come altri sottolineano, break
è obbligatorio nelle dichiarazioni switch
(o almeno gli standard di codifica del tuo futuro datore di lavoro lo avrebbero reso obbligatorio), quindi non ha senso discutere.
-
break
è semplicemente un trasferimento di controllo verso il fondo (uscita) del ciclo. Pertanto non attraversa il flusso di controllo del loop stesso.
-
continue
trasferimenti all'inizio (loop advance e condition test) del loop. Se il test condizione è falso, esce anche il ciclo. Notare che la parte "se il test delle condizioni fallisce ..." è un flusso di controllo diverso . continue
deve solo trasferirsi all'inizio.
In poche parole, break
e continue
utilizzati all'interno di un ciclo non violano la struttura del flusso di controllo sensibile. Questo è il motivo per cui sono consentiti in primo luogo in linguaggi storicamente significativi come Pascal, ecc. dove la progettazione della lingua supera considerazioni pratiche.
Ora, per quanto riguarda alcuni post che affermano che break
è sbagliato se appare nel mezzo di un codice senza effetti collaterali, direi sì e no.
La maggior parte delle volte, se vedi che succede, è perché deve essere così. La realtà rende questo argomento discutibile.
Esempio: in alcuni dei tuoi codici, devi farlo all'interno di un ciclo:
- Controlla prima la condizione A. Se fallisce puoi fare
break
(o continue
, a seconda dell'attività).
- Solo se la condizione A è soddisfatta, puoi iniziare a calcolare qualche valore B.
- Con B calcolato, controllerai anche la condizione B (utilizzando il valore di B).
Puoi spostare il controllo delle condizioni B all'inizio del ciclo? Non puoi È dettato dalla natura del compito che stai implementando. Quindi l'argomento è discutibile. Se questo argomento, favorisce scomporre le funzioni lunghe in subroutine più brevi , piuttosto che argomentare per un posizionamento accurato dell'uso delle istruzioni break
.