Qual è il termine per "while (true)" loop con "break" all'interno? [chiuso]

23

Supponiamo che abbia un ciclo in C ++ o C # che funzioni in questo modo:

while( true ) {
    doSomething();
    if( condition() ) {
        break;
    }
    doSomethingElse();
}

Questo è comunemente chiamato "ciclo infinito". Tuttavia non è tecnicamente infinito: si fermerà quando il controllo passa attraverso break .

Qual è il termine per tale ciclo - che ha un'istruzione di controllo del ciclo "loop forever" e "interruzione" all'interno?

    
posta sharptooth 09.12.2011 - 10:13
fonte

13 risposte

21

Studiando CS, questo professore ci ha insegnato che ci sono cicli di pre-controllo ( while(cond) {} ), cicli di post-controllo ( do {} while(cond); ) e cicli di controllo medio . (Potrei averlo tradotto male in inglese, ma tu hai l'idea.)

C e C ++ non hanno il secondo (ISTR Ada che lo ha, BICBW), quindi il tuo costrutto è usato per quello in C e C ++.

    
risposta data 09.12.2011 - 16:58
fonte
11

Il primo corso di CS a Stanford ( Metodologia di programmazione di Mehran Sahami ) si riferisce a questo come un loop e mezzo . E non è necessariamente una cattiva pratica di programmazione. Considera questo esempio sulla raccolta di input dell'utente (tratto da L'arte e la scienza di Java di Eric Roberts , dove Roberts chiama anche a-loop-and-a-half ):

prompt user and read in the first value
while (value != sentinel) {
    process the data value
    prompt user and read in a new value
}

E poi la stessa soluzione è stata risolta usando l'idea del loop e mezzo per evitare il codice duplicato:

while (true) {
    prompt user and read in a value
    if (value == sentinel) break;
    process the data value
}
    
risposta data 15.12.2011 - 20:26
fonte
10

In mancanza di un nome ufficiale, lo chiamerei Broken Loop . L'ambiguità di questo termine è intesa, poiché un'interruzione nel mezzo di un ciclo è un po 'sporca, quasi come un goto .

    
risposta data 09.12.2011 - 12:43
fonte
8

Non esiste un nome definitivo. Il ciclo infinito è, penso, il termine appropriato. Nessun loop è veramente infinito, ma questo ha il potenziale per essere effettivamente infinito poiché è possibile che il ramo che contiene l'interruzione non si verifichi mai.

Se dici a qualcuno "crea un ciclo infinito e usa una pausa per la condizione X" e sapranno cosa intendi. Se qualcuno sta rivedendo il tuo codice e non dice altro che "Non mi piace il ciclo infinito che hai scritto", saprai di cosa stanno parlando (a meno che tu ne abbia più di uno, ovviamente).

    
risposta data 09.12.2011 - 12:45
fonte
8

È un ciclo do-while con il condizionale nel posto sbagliato.

    
risposta data 09.12.2011 - 14:54
fonte
6

Voterò per "loop incondizionato" , simile a "salto incondizionato". Illustra esattamente cosa sta succedendo (il codice scorre in modo incondizionato), senza mentire (a differenza del "loop infinito").

    
risposta data 09.12.2011 - 14:25
fonte
5

What's the term for such loop - that has "loop forever" loop control statement and "break" inside?

È un loop infinito con una condizione di interruzione.

Sarei d'accordo con ammilind nel senso che se volessi dargli un nome speciale potresti chiamarlo Infinite Partial Loop

    
risposta data 09.12.2011 - 14:23
fonte
4

Non esiste un termine standard, ma lo direi come Ciclo parziale .

Questo ciclo viene utilizzato quando desideri interrompere solo dopo l'esecuzione di una parte del ciclo un'ultima volta (ad esempio l'esecuzione parziale). Viene utilizzato quando non trovi una situazione adatta in cui potresti voler interrompere il whole loop .

In questo caso, vuoi interrompere il ciclo dopo aver eseguito almeno doSomething() un'ultima volta.

    
risposta data 09.12.2011 - 10:54
fonte
4

Sul codice Rosetta, questo particolare modello è descritto come un loop "N plus one half" . Anche se non è il mio termine preferito, non è terribile ed è chiaramente un modello che è utile per alcuni tipi di loop. (Le alternative consistono nel duplicare il codice prima della condizione - potenzialmente ingannevole nei programmi reali - o aumentare la profondità di annidamento del codice post-condizione durante l'aggiunta di una variabile di condizione del ciclo, né migliora la manutenibilità o la comprensibilità del codice L'unico motivo per rifiutare tali costrutti è se uno insiste su cicli di scrittura per essere break -free.)

    
risposta data 12.12.2011 - 14:59
fonte
2

Devo essere d'accordo con sbi qui - Mi piace il termine ciclo di controllo medio . Questo tipo di costrutto era più popolare quando la programmazione strutturata iniziava a girare e molte lingue avevano il supporto sintattico per loro.

Detto questo, è ormai diffusa la consapevolezza che i cicli di while di solito sono più maneggevoli, dal momento che è più facile ragionare sugli invarianti e spesso gestiscono meglio il caso complicato e vuoto.

Nel tuo caso particolare il tuo loop è solo equivalente a

for(; doSomething(), !condition(); doSomethingElse()){}

quindi utilizzerei solo la versione break se doSomething o doSomethingElse riguardava più istruzioni e preferirei non inserirle in funzioni separate come hai fatto tu.

Detto questo, se il tuo ciclo è più complicato di un iterazione (avvio, controllo, incremento) dovresti prendere in considerazione la possibilità di rifarlo in qualcosa di più semplice.

    
risposta data 12.12.2011 - 14:09
fonte
1

Suppongo che se tenteremo di inventare un termine per questo, forse:

Escapable Loop

    
risposta data 09.12.2011 - 16:18
fonte
0

Lo chiamo di cosa si tratta, un "ciclo vero e proprio".

Vedi anche è mentre (vera) cattiva pratica di programmazione?

    
risposta data 09.12.2011 - 17:27
fonte
0

Non è così male in ogni caso. Mi trovo a scrivere questo tipo di loop con un certo tipo di API. Supponiamo, ad esempio, di avere un oggetto loop e di controllare alcune condizioni piuttosto profonde, in questo modo:

while (loop
    .getAExecutionModelFactory()
    .getActiveXexecutor()
    .getYCancelModelHandler()
    .getCurrentHandler()
    .isCancelled()) {
        // ... do something with the current Handler ....
        loop = ..... // prepare for next loop
}

Supponiamo che ogni metodo getXXX possa potenzialmente restituire null. Quindi sarebbe ancora possibile scrivere un'espressione booleana, anche se piuttosto complicata e illeggibile. E poi dobbiamo rifare quasi lo stesso per ottenere l'attuale oggetto gestore. In questi casi, trovo più semplice scrivere un ciclo while (true) con interruzione e continuare.

    
risposta data 12.12.2011 - 14:37
fonte

Leggi altre domande sui tag