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


24

Supponiamo di avere un ciclo in C ++ o C # che vada in questo modo:

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

Questo è comunemente chiamato "ciclo infinito". Eppure non è tecnicamente infinito - si fermerà una volta che il controllo scorre break.

Qual è il termine per tale ciclo - che contiene l'istruzione di controllo del ciclo "loop forever" e "break" all'interno?


22
Non penso che ci sia un termine speciale.
ChrisF

2
C'è qualche garanzia che il controllo possa mai fluire attraverso l'interruzione? In quell'esempio, cosa succede se condition()restituisce sempre false? Direi che è un ciclo infinito con interruzioni condizionali.
JohnL

1
Anche senza a break, il ciclo non è infinito ( kill, ctrl-alt-del, unplug ...). Allora perché preoccuparsi dei dettagli terminologici?
mouviciel,

5
"Qual è il termine?" - "Questo è comunemente chiamato ciclo infinito". Questa è la tua risposta proprio lì. Chiaramente non sei soddisfatto del termine, ma ciò non toglie il fatto che le lingue (naturali) siano descrittive. Il "termine per X" è qualunque cosa le persone stiano usando, non ciò che dovrebbero usare.
MSalters il

5
Questa domanda sembra essere fuori tema perché è una domanda "dai un nome a quella cosa". "Nomina quella cosa" sono cattive domande per le stesse ragioni che "identificano questo oscuro show televisivo, film o libro in base ai suoi personaggi o alla sua storia" sono cattive domande: non puoi cercarle su Google, non sono pratiche in alcun modo, loro non aiutare nessun altro e consentire loro di aprire la porta per porre altri tipi di domande marginali. Vedi blog.stackoverflow.com/2012/02/lets-play-the-guessing-game
moscerino

Risposte:


24

Studiando CS, questo professore ci ha insegnato che ci sono loop di pre-controllo ( while(cond) {}), loop di post-controllo ( do {} while(cond);) e loop di controllo intermedio . (Potrei averlo tradotto male in inglese, ma hai capito.)

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


1
Sì, Ada ha questo:loop ... exit when condition; ... end loop;
Keith Thompson il

@Keith: grazie per aver confermato! Sono passati quasi 20 anni da quando ho fatto un po 'di Ada.
sabato

1
Per quel che vale, sono programmatore professionista da oltre 20 anni (e hobbista più a lungo di così), e non ho mai sentito quei termini.
entro il

Per quanto riguarda la traduzione, penso che "in" di solito sia più appropriato quando si usano "pre" e "post", ad es. "Preorder / postorder / inorder traversal tree".
Oak,

1
Il termine con cui sono cresciuto era "circuito a metà uscita". Ho lavorato in un paio di lingue diverse con il supporto esplicito per i loop a metà uscita.
mjfgates,

13

Il primo corso di CS a Stanford ( Metodologia di programmazione di Mehran Sahami ) si riferisce a questo come un ciclo e mezzo . E non è necessariamente una cattiva pratica di programmazione. Considera questo esempio sulla raccolta di input da parte degli utenti (tratto da The Art and Science of Java di Eric Roberts , in cui Roberts lo chiama anche 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 cosa risolta usando il ciclo e una mezza idea per evitare il codice duplicato:

while (true) {
    prompt user and read in a value
    if (value == sentinel) break;
    process the data value
}

10

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


Direi, molto peggio di un goto. Preferirei vedere un goto piuttosto che una condizione falsamente costruita in un ciclo del genere.
Brian Knoblauch,

14
@Brian What? La condizione "vera" lo rende ovvio e cicli del genere sono davvero comuni. Ad esempio, se vuoi aggiungere ogni riga di un file in un elenco, devi provare a leggere la riga (fare qualcosa), fermarti se fallisce (se la condizione si interrompe), altrimenti aggiungerla all'elenco e ripetere (fai qualcosa altro).
Craig Gidney,

7
Non c'è niente di sbagliato nel break nel mezzo di un loop. Se è necessario eseguire alcune operazioni ad ogni avvio del ciclo, sarà necessario duplicare il codice o inserire queste operazioni nella condizione. Entrambe le varianti presentano chiaramente degli svantaggi. gotoaveva anche applicazioni valide, ad es. emulazione di un tentativo ... infine blocco in C.
Malcolm

1
Malcolm: Il possibile problema è che durante la lettura del codice, è più difficile vedere quando e perché il ciclo viene chiuso. Ulteriori problemi sorgono quando si annidano due o più di questi loop e si desidera uscire dal loop esterno in base a una condizione trovata nel loop interno.
user281377

Diciamo che si dispone di un ciclo di eventi di guida un'applicazione Xorg, come (in pseudo-codice :) while(XEventGet(&ev) != NULL){ ... }, si sta naturalmente andando a voler controllare le chiavi all'interno del ciclo: if(ev.key == XK_q) break;. Effettuare quanto segue while(XEventGet(&ev) != NULL && ev.key != XK_q){ ... }:, è brutto e probabilmente più difficile da leggere rispetto a una pausa nel ciclo intermedio. Inoltre, cosa succede se qualcosa deve essere fatto al valore prima di poterlo verificare? Non inserirai seriamente tutto questo nel case base del loop, vero?
Braden Best

8

Non esiste un nome definitivo. Penso che il ciclo infinito sia 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 non ne abbia più di uno, ovviamente).


1
Non è un ciclo infinito; ha una condizione di terminazione ben definita, proprio come un normale whileloop e il modo in cui esegui la prova di terminazione è esattamente lo stesso (trovare una metrica a riduzione monotona è un ottimo inizio).
Donal Fellows,

8

È un ciclo da fare con il condizionale nel posto sbagliato.


2
Sì, dovrebbe essere scritto: while (keep_going) {doSomething (); if (condizione) {keep_going = false; } else {doSomethingElse (); }}
Stephen Gross,

10
quindi ... stai dicendo che se stai insegnando un corso di computer e vuoi descriverlo, diresti "e ora, impareremo il ciclo * do-while con il condizionale nel posto sbagliato "? Sembra più un'opinione religiosa piuttosto che un nome.
Bryan Oakley,

5
@StephenGross Quel frammento di codice è un suggerimento orribile. Rifattore per inserire la condizione effettiva nella definizione del loop, o semplicemente usare breako continue. Evita i valori sentinella a tutti i costi, sono solo un altro pezzo di stato arbitrario di cui tenere traccia mentalmente, che nasconde lo scopo del codice.
Izkata,

2
I valori sentinali sono goto ritardati.
Winston Ewert,

2
-1 per essere un weenie ad uscita singola.
Donal Fellows,

6

Vorrei votare per "ciclo incondizionato" , simile a "salto incondizionato". Illustra esattamente cosa sta succedendo (il codice scorre incondizionatamente), senza mentire (a differenza di "ciclo infinito").


1
Ma ha una condizione di terminazione; che if/ breaknel mezzo fa parte del modello.
Donal Fellows,

5

Qual è il termine per tale ciclo - che contiene l'istruzione di controllo del ciclo "loop forever" e "break" all'interno?

È un ciclo infinito con una condizione di rottura.

Concordo con ammilind sul fatto che se volessi dargli un nome speciale, potresti chiamarlo Infinite Partial Loop


1
Non è affatto infinito; il punto in cui viene verificata la condizione di terminazione è solo in un posto diverso.
Donal Fellows,

5

Su Rosetta Code, questo particolare schema è descritto come un ciclo "N più una metà" . Anche se non è il mio termine preferito, non è terribile ed è chiaramente uno schema utile per alcuni tipi di loop. (Le alternative sono duplicare il codice prima della condizione - potenzialmente complicato nei programmi reali - o aumentare la profondità di annidamento del codice dopo la condizione durante l'aggiunta di una variabile di condizione del ciclo; né migliora la manutenibilità o la comprensibilità del codice L'unica ragione per rifiutare tali costrutti è se si insiste sulla scrittura di loop per essere breakliberi.)


4

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

Questo ciclo viene utilizzato quando si desidera interrompere solo dopo aver eseguito una parte del ciclo un'ultima volta (ovvero l'esecuzione parziale). Viene utilizzato quando non trovi una situazione adatta in cui potresti voler interrompere l' intero ciclo .

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


2

Devo essere d'accordo con sbi qui - mi piace il termine del ciclo di controllo intermedio. Questo tipo di costrutto è diventato più popolare quando la programmazione strutturata ha iniziato a girare e molte lingue hanno avuto il supporto sintattico per loro.

Detto questo, è ormai risaputo che i whileloop sono generalmente più gestibili, poiché è più facile ragionare sugli invarianti e spesso gestiscono meglio il difficile caso vuoto.

Nel tuo caso particolare il tuo loop equivale a

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

quindi userei la breakversione solo se una doSomethingo con doSomethingElsepiù dichiarazioni e preferirei non metterle in funzioni separate come hai fatto tu.

Detto questo, se il tuo ciclo è più complicato di un'iterazione (di avvio, controllo, incremento), dovresti considerare di rifattorizzarlo in qualcosa di più semplice.


1

Immagino che se proveremo a inventare un termine per questo, forse:

Loop evitabile


-1. la domanda non riguarda la creazione di un nome, è se esiste già un nome comune. Inoltre, tutti i loop sono "evitabili", quindi non è un nome particolarmente efficace.
Bryan Oakley,

@BryanOakley Un loop infinito, per definizione, non dovrebbe essere fragile. Probabilmente non ci dovrebbe essere un termine per questo, a parte una cattiva programmazione.
LarsTech,


0

Non è poi così male. Mi ritrovo a scrivere questo tipo di loop con un certo tipo di API. Supponiamo, ad esempio, di avere un oggetto loop e che sia necessario verificare la presenza di una condizione abbastanza profonda, in questo modo:

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.