Come funziona un ciclo for, in particolare per (;;)?

Guardando attraverso un vecchio codice aziendale, mi sono imbattuto in un ciclo for che assomiglia a questo:

for (;;) { //Some stuff } 

Ho provato Google ma non ho trovato nessuna risposta. Mi sono addormentato in una class di programmazione o si tratta di un loop insolito?

Un ciclo for in java ha la seguente struttura:

 for (initialization statement; condition check; update) loop body; 

Come puoi vedere, ci sono quattro affermazioni qui –

  1. Istruzione di inizializzazione: questa istruzione viene eseguita una sola volta, quando il ciclo viene immesso per la prima volta. Questa è una dichiarazione opzionale, che significa che puoi scegliere di mantenere questo campo vuoto. Viene generalmente utilizzato per alcuni scopi di inizializzazione.
  2. Controllo condizionale: questa affermazione è probabilmente la più importante. Verifica per verificare se determinate espressioni sono vere o meno. Se lo è, l’esecuzione del ciclo continua. Puoi scegliere di mantenere questo campo vuoto, che verrà valutato come true .
  3. Aggiornamento: questo elenco di istruzioni viene eseguito da sinistra a destra, in genere utilizzato per incrementare / decrementare alcune variabili.
  4. loop body: il corpo del loop, che verrà eseguito ancora e ancora in base al valore di verità del controllo condizionale.

In pratica, questo è il modo in cui viene eseguita l’esecuzione: in primo luogo, quando il ciclo viene immesso per la prima volta, l’istruzione di inizializzazione viene eseguita una volta. Quindi viene eseguito il controllo condizionale per verificare se è stato valutato su true. Se lo è, allora viene eseguito il corpo del ciclo, altrimenti l’esecuzione del ciclo è terminata. Dopodiché, le istruzioni Update vengono (vengono) eseguite. Successivamente, il controllo condizionale viene eseguito nuovamente e, se viene valutato su true, viene eseguito nuovamente il corpo del ciclo, quindi viene eseguita l’istruzione di aggiornamento, quindi il controllo condizionale …. viene visualizzata l’immagine.

Ora sulla tua syntax for( ; ; ) ;; for( ; ; ) . Non ha alcuna istruzione di inizializzazione, quindi non verrà eseguito nulla. La sua istruzione di controllo condizionale è anch’essa vuota, quindi ciò significa che è true. Successivamente viene eseguito il corpo del loop. Successivamente, poiché l’istruzione update è vuota, non viene eseguito nulla. Quindi viene eseguito di nuovo il controllo condizionale che tornerà a essere true e quindi l’intero processo verrà ripetuto nuovamente.

Quindi, vedete, questo è fondamentalmente un ciclo infinito che non ha alcuna istruzione di inizializzazione, il cui controllo condizionale valuterà sempre true, e che non ha alcuna istruzione di aggiornamento. Questo è equivalente a –

 while(true) { ..... } 

che è un altro popolare costrutto di loop in java.

Quando si utilizza un ciclo infinito come questo, è importante prestare attenzione alle condizioni di rottura poiché nella maggior parte dei casi non è ansible lasciare un ciclo a esecuzione indefinita. Per uscire da questo tipo di loop, puoi usare l’istruzione break . La struttura è come segue –

 if(some_condition_is_true) break; // This will cause execution to break out of its nearest loop 

o

 if(some_condition_is_false) break; 

Questo è lo stesso di:

 while(true) { //Some Stuff } 

Fondamentalmente, una syntax alternativa per un ciclo infinito.

Questi sono tutti loop infiniti

 for(;;) { // endlessly } while(true) { // endlessly } do { // endlessly } while(true); 

Questo ciclo non ha guardia e agisce come un ciclo (vero) while. Andrà in loop infinito fino alla pausa.

È un ciclo infinito. Non esattamente una buona codifica, perché non è intuitivo che sarebbe in realtà compilare o non generare un errore di runtime. Riscrivere mentre while(true) { /* code */ } sarebbe molto più leggibile per indicare un ciclo infinito.

È un ciclo infinito. Le istruzioni di inizializzazione, condizione e incremento sono tutte opzionali, quindi senza nessuna di esse, questo verrà sempre ripetuto di nuovo (a meno che non si verifichi un’interruzione o qualche altro costrutto interagisca con esso).

Anche se non sono sicuro di Java, questa domanda spiega come in .Net il tuo vuoto for un while (true) verrà compilato esattamente allo stesso modo. Non sarei sorpreso se anche Java funzionasse.