2013-04-19 11 views
18

Im personalizzazione di un codice trovato su Internet (è la ricevuta del tweet di adafruit). Non riesco a capire molte parti del codice, ma il più sconcertante per me è il ciclo for con due punti e virgola all'interno delle parentesiDue punti e virgola all'interno di parentesi for-loop

boolean jsonParse(int depth, byte endChar) { 
    int c, i; 
    boolean readName = true; 

    for(;;) { //<--------- 
    while(isspace(c = timedRead())); // Scan past whitespace 
    if(c < 0) return false; // Timeout 
    if(c == endChar) return true; // EOD 

    if(c == '{') { // Object follows 
     if(!jsonParse(depth + 1, '}')) return false; 
     if(!depth) return true; // End of file 
     if(depth == resultsDepth) { // End of object in results list 

Che cosa significa for (;;) dire? (Si tratta di un programma di arduino quindi immagino che sia in C)

+7

Questo è un ciclo "Forever" idiomatico che fa risalire le sue origini al libro K & R. – dasblinkenlight

+0

Sembra Java per me, non C. – Magnilex

+0

Possibile duplicato di [Domanda Loop For Two Two Colon Java] (https://stackoverflow.com/questions/5676992/two-semi-colon-java-for-loop-question) – Archmede

risposta

46
for(;;) { 
} 

significa funzionalmente

while (true) { 
} 

sarà probabilmente rompere il ciclo/ritorno da ciclo sulla base di alcune condizioni all'interno del corpo del ciclo.

La ragione per cui for(;;) loop per sempre è perché for ha tre parti, ognuno dei quali è facoltativa. La prima parte inizializza il ciclo; il secondo decide se continuare o meno il ciclo e il terzo fa qualcosa alla fine di ogni iterazione. E 'piena forma, è in genere vedere qualcosa di simile:

for(i = 0; i < 10; i++) 

Se il primo (inizializzazione) o l'ultimo (end-of-iterazione) parti mancanti, non si fa nulla al loro posto. Se manca la parte intermedia (test), allora è come se true fosse lì al suo posto. Quindi for(;;) è lo stesso di for(;true;) ', che (come mostrato sopra) è lo stesso di while (true).

+0

@Wayne Conrad ringrazia molte volte per la tua modifica, molto meglio. – taocp

+0

"ognuno dei quali è facoltativo" immagino che sia qualcosa che non insegnano in un corso accelerato di programmazione (anche se ho visto e usato i cicli for che hanno omesso la parte iteratore, mi sono sempre chiesto). Grazie. è anche la prima volta che chiedo in stackoverflow e sono stupito dalla velocità con cui è stata data una risposta a questa domanda. se non ti dispiace, puoi dirmi perché qualcuno ha svalutato questa domanda? so che è una domanda stupida, ma ho pensato che fosse legittimo. – osse

2

Il ciclo for ha 3 componenti, separati da punti e virgola. Il primo componente viene eseguito prima dell'avvio del ciclo e viene comunemente utilizzato per inizializzare una variabile. Il secondo è una condizione. La condizione viene verificata all'inizio di ogni iterazione e, se viene valutata su true, viene eseguito il codice nel ciclo. Il terzo componente viene eseguito alla fine del ciclo, prima che inizi un'altra iterazione (che inizia con il controllo delle condizioni) e venga spesso utilizzato per incrementare una variabile.

Nel tuo caso for(;;) significa che verrà interrotto per sempre poiché la condizione non è presente. Il ciclo termina quando il codice return s oppure break s.

2

Ogni clausola di un ciclo for è facoltativa. Quindi, quando sono esclusi, circolano ancora. I loop for vengono compilati nei loop while.

Il risultato finale diventa un controllo per inizializzare qualsiasi variabile, che si conclude dopo che nulla è accaduto poiché è vuoto, un controllo alla condizione booleana nella seconda clausola, che non è presente in modo che il ciclo si avvii e una volta che il ciclo ha esito positivo la parentesi finale, un controllo per vedere se c'è qualche codice da eseguire prima di verificare nuovamente la condizione booleana.

Nel codice Assomiglia:

while(true){ 

} 
2

Ecco cosa Wikipedia Says Chi è

Usa come un loop infinito
Questo stile C per-loop è comunemente la fonte di un ciclo infinito poiché i passaggi fondamentali dell'iterazione sono completamente sotto il controllo del programmatore.Infatti, quando cicli infiniti sono destinati, questo tipo di ciclo for può essere utilizzato (con espressioni vuote), come ad esempio:

for (;;)
//loop body

Questo modello viene utilizzato al posto di infiniti while(1) cicli per evitare un avviso di conversione di tipo in alcuni compilatori C/C++. Alcuni programmatori preferiscono il modulo più breve for(;;) sul modulo semantico equivalente ma più dettagliato while (true).

Problemi correlati