2011-08-16 9 views
47

Guardando attraverso qualche vecchio codice azienda, mi sono imbattuto in un ciclo for che assomiglia a questo:Come funziona un ciclo for, in particolare per (;;)?

for (;;) { 
    //Some stuff 
} 

ho cercato di Google ma non ho trovato alcuna risposta. Mi sono addormentato in una classe di programmazione o si tratta di un loop insolito?

risposta

70

Un for ciclo in Java ha la seguente struttura -

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

Come si può vedere, ci sono quattro qui le istruzioni -

  1. inizializzazione: questo prospetto viene eseguito solo una volta, quando la il ciclo viene inserito 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. È possibile scegliere di mantenere questo campo vuoto, che verrà valutato su true.
  3. Aggiornamento: questo elenco di istruzioni viene eseguito da sinistra a destra, in genere utilizzato per incrementare/decrementare alcune variabili.
  4. corpo del loop: il corpo del ciclo, che verrà eseguito ancora e ancora in base al valore di verità del controllo condizionale.

Fondamentalmente segue 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 sintassi 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 comunicato l'inizializzazione, la cui condizione di spunta restituisce sempre vero, e che non ha 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 alla condizione di rottura come nella maggior parte dei casi non si può lasciare un ciclo a tempo indeterminato. Per uscire da questo tipo di loop, è possibile utilizzare l'istruzione break. La struttura è la seguente -

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

o

if(some_condition_is_false) 
    break; 
34

Questo è lo stesso:

while(true) { 
    //Some Stuff 
} 

Fondamentalmente, una sintassi alternativa per un ciclo infinito.

+0

Anche se ci viene insegnato a evi d usando loop infinito, io sono colpevole di un po '(vero) in più di un'occasione. –

+2

Mi sento come se avessero i loro momenti in cui sono utili – user489041

+4

Almeno se si utilizza mentre (vero) la persona che legge il codice sembra più probabile capirlo ... – PeterT

6

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

+3

o un ritorno! ... ~ –

+10

o un overflow dello stack –

+0

non dovrei immaginare questo stack overflow in quanto non v'è alcuna pila di tornare all'inizio di un ciclo. – Wes

2

È 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, this question spiega come in .Net il tuo for vuoto e uno while (true) verranno compilati esattamente per la stessa cosa. Non sarei sorpreso se anche Java funzionasse.

3

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

+0

Hai dimenticato la parentesi di chiusura nell'esempio di codice: D –

+0

hai ragione che il mio codice non ha rilevato la parentesi chiusa come scritto a causa del commento in linea, ma volevo semplicemente averlo tutto in una riga. –

8

Questi sono tutti i cicli infiniti

for(;;) { 
    // endlessly 
} 

while(true) { 
    // endlessly 
} 

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

/* While

5 dollari

1 cioccolato = 1 bucks

while my money is greater than 1 bucks 
    select chocolate 
    pay 1 bucks to the shopkeeper 
    money = money - 1 
end 

vengono a casa e non posso andare a mentre negozio perché i miei soldi = 0 dollari */

#include<stdio.h> 
int main(){ 
    int money = 5; 

    while(money >= 1){ 
    printf("inside the shopk and selecting chocolate\n"); 
    printf("after selecting chocolate paying 1 bucks\n"); 
    money = money - 1 ; 
    printf("my remaining moeny = %d\n", money); 
    printf("\n\n"); 
    } 

    printf("dont have money cant go inside the shop, money = %d", money); 

    return 0; 
} 

denaro infinito

while(codition){ // condition will always true ....infinite loop 
    statement(s) 
} 

si prega di visitare questo video per una migliore comprensione https://www.youtube.com/watch?v=eqDv2wxDMJ8&t=25s