2015-05-08 9 views
10

Anche se ho una certa esperienza in Java, il seguente codice è un po 'strano per me:Strano "per (;;)" loop infinito in Java, come è utile?

public class ForLoopTest{ 
    public static void main(String[] args){ 
     for(;;){} 
    } 
}

Questo codice compila bene, anche se la parte di inizializzazione-test-incremento è vuota, a differenza di un normale ciclo for:

for(int i=0; i<10; i++){} 

Poiché il codice viene compilato correttamente, è una sintassi valida.

Esiste un uso pratico di questo tipo di ciclo for in cui non è presente una parte di inizializzazione-test-incremento?

+2

http://stackoverflow.com/questions/29414954/issues- with-clone-and-for-loop/29415184 # 29415184 Questo dovrebbe rispondere alla tua domanda :) – damus4

+2

Vedere questo loop ti consente di rilevare i programmatori con un'esposizione precedente a C. In particolare, i programmatori che leggono K & R preferirebbero questo stile di loop, anche in Java e C#. – dasblinkenlight

+0

[Code golf?] (Http://codegolf.stackexchange.com/questions/tagged/code-golf) – TNT

risposta

12

È equivalente a while(true) {}.

Non esiste un vero motivo per utilizzare o non utilizzare un ciclo for in quel modo (e spesso non si scrive un ciclo while(true)).

+0

Certo, c'è un vero motivo per usarlo: nei concorsi di golf del codice è più breve e prende meno caratteri: D –

+0

C'è una buona ragione: è l'idioma standard, il modo canonico di scrivere il "ciclo infinito" in C. È menzionato nel Kernighan e nel Ritchie. Ci sono molti modi per avere lo stesso effetto, ma se * non * usi 'for (;;)', qualcuno che legge il tuo programma perderà tempo a cercare il motivo reale per cui lo hai fatto. E ti maledico perché non ne hai avuti. –

+0

@MichelBillaud Direi che se qualcuno sta leggendo il codice Java e pensa a K & R, sta chiedendo dei problemi. – Kayaman

2

Kayaman è corretto. Un ciclo in quel formato dovrà avere qualche condizione di uscita al suo interno, o sarà indubbiamente un ciclo infinito. La maggior parte delle persone usa mentre (vero) in questo caso poiché è più facile da capire. Ho avuto un prof una volta mi dicono che l'unico vantaggio di for(;;) {} è che sembra più impressionante di while(true).

6

È un ciclo infinito. Il modo in cui si può utilizzare (senza essere un ciclo infinito) sarebbe come questo (si avrà probabilmente mai usare in questo modo):

int i = 0; 
for(;;) { 
    if(i == 10) { 
     break; 
    } 
    i++; 
} 
8

Questo è un modo di scrivere un ciclo infinito. E 'equivalente a:

while(true){ }


Oppure:

boolean loop = true; 
while (loop) { 
    //do nothing 
} 

O anche:

int theAnswerToTheQuestionOfLifeTheUniverseAndEverything = 42; 
while(theAnswerToTheQuestionOfLifeTheUniverseAndEverything == 42) { 
    //do nothing 
} 

4

il ciclo for(;;){} equivale a while(true) {} Sì, si tratta di un ciclo Inifinite.

Se la tua domanda è: ci sono dei motivi per usarlo? La risposta è forse sì.

Ti do un esempio:

Che cosa succede se si vuole fare un programma che legge le misure di volta in volta in modo continuo? come un monitor che ti mostra cosa fa una registrazione dron o qualcosa di simile?

Potrebbe essere necessario un ciclo come questo per aggiornare l'immagine.

Ma sì, di solito non è necessario per niente.

2

Come Kayaman ha anche detto che è equivalente a while(true) {}.

Un caso di utilizzo a cui riesco a pensare è: se è necessario eseguire un'operazione non appena un file di semaforo arriva in una directory. È possibile continuare a controllare l'arrivo del file in un ciclo infinito, non appena arriva il file quindi eseguire un'operazione e interrompere il ciclo

2

for(;;) equivale a while(true). La ragione per cui si vede il primo più spesso nel codice è che è il modo canonico di codificare un ciclo infinito nel linguaggio di programmazione C da cui Java ha preso in prestito molti elementi sintattici e che è lo sfondo di molti sviluppatori Java.

Utilizzando while(true) potrebbe apparire più diretto, ma il linguaggio di programmazione non ha avuto C tipi booleani né true letterale in principio, quindi l'equivalente doveva essere while(1) poi, che non sembra meglio di for(;;). Ha aiutato quest'ultimo a diventare un modello comune come è stato specificato da K & R (vedi this answer) come l'idioma per un ciclo eterno.

Bene, e cambiando il linguaggio di programmazione non implica necessariamente cambiare le abitudini, in modo da vedere for(;;) in Java ormai quasi tutte le volte che in C.