2010-10-08 14 views
12

Ho trovato una dichiarazione vuota in un bit di codice esistente e mi chiedo che cosa faccia ed è "sicuro". Sembra sbagliato.In C# è un per (;;) sicuro e cosa fa veramente?

for(;;) 
{ 
    //some if statements and a case statement 
} 

Grazie!

+0

Grazie a tutti. C'è una pausa e in questo caso è il caso che il codice debba essere modificato per una migliore leggibilità. –

+0

Se si ottiene la risposta desiderata, è necessario fare clic sul segno di spunta accanto ad essa per premiare l'autore. :) –

+0

Vedere http://stackoverflow.com/questions/2888558/java-what-is-for/2888580#2888580 per una spiegazione. Funziona allo stesso modo in Java, C++ e C#. Ed ecco il mio fondamento logico per preferire questo a 'while (true)': http://stackoverflow.com/questions/2611246/is-for-faster-than-while-true-if-not-why-do-people-use -it/2611529 # 2611529 – jalf

risposta

17

Questo è un modo per creare un ciclo infinito. È un normale ciclo for, ma con inizializzazione, condizione e espressioni di incremento vuote. Poiché l'espressione di condizione è un no-op, il ciclo non esce mai. È perfettamente "sicuro" supponendo che abbia una condizione di terminazione (una dichiarazione break o return [o anche una goto, suppongo]) da qualche parte.

Personalmente, preferisco scrivere cicli infiniti con while s:

while (true) 
{ 
    //some statements and a case statement 
} 

(perché for è per iterazione e while è per ripetizione).

Tuttavia, dopo aver letto this question (collegato da @jailf), ora preferisco while (42) { ... }.

+5

Vorrei usare whiles solo per migliorare la leggibilità del codice –

+6

Considero 'for (;;)' più leggibile. :) Se non c'è nessuna condizione per il mio ciclo, perché dovrei scriverne uno (come 'true')? ('for (;;)' dice esplicitamente al lettore che "non esiste una condizione di terminazione per questo ciclo", che considero leggibile come si ottiene – jalf

+5

È un interessante bit di curiosità chiedere a studenti e novizi se un booleano completamente vuoto l'espressione è vera o falsa: molti di noi considererebbero "vuoto" il più analogo a 0/falso, ma C considera vuoto come vero, come mostrato da questa espressione – abelenky

2

È una sintassi valida per un ciclo infinito. Devi "rompere"; fuori di esso. Questo è stato molto popolare nei giorni C++ IIRC.

Per quanto sia sicuro, hai ragione a sentirti "sbagliato" su questo. Di solito ci sarebbe una condizione "se" all'interno della quale decideresti se continuare o interrompere il ciclo. Se non si verificano tutti i percorsi di esecuzione, potrebbe benissimo portare a un ciclo infinito. Vorrei provare a farlo in un altro modo.

5

E 'equivalente ad avere un ciclo infinito:

while (true) { 

} 

E' sicuro. Tuttavia, è necessario fornire un meccanismo di uscita esterna. I.E., con un'interruzione all'interno del ciclo for.

1

Ci sono state dichiarazioni break, return o throw? Questa è l'unica via d'uscita. È sicuro? Dipende se ti senti al sicuro all'interno di un ciclo infinito. Alcune applicazioni ne hanno bisogno.

+0

... o chiamate che possono lanciare, anche loro scoppiano. ;-) – Lucero

+0

'goto' può anche farti fuori dal giro anche se non lo userei. –

+0

@Tuzo, sì, non lo uso mai, quindi non penso nemmeno a questa possibilità. Ma hai ragione, ovviamente. – Lucero

2

A volte viene chiamato ciclo "per sempre", perché è quello che fa. Cercare un'istruzione break; o return; all'interno del ciclo o il ciclo da avvolgere in un blocco try/catch. Personalmente, cerco di evitare quel genere di cose.

3

Tutte le espressioni dell'istruzione for sono facoltative; per esempio, la seguente dichiarazione viene utilizzato per scrivere un ciclo infinito:

> for (; ;) { 
>  // ... } 

Tratto da MSDN

3

E 'lo stesso di while (true) { /**/ } ... ciclo infinito finché non si verifica break o return o simili.

Tutto ciò che realmente "fa" è guardare brutto IMO;)

+1

In C#, un '1' non è equivalente al valore booleano' true'. – Lucero

+0

buona cattura, riparato. –

4

Questo è un idioma comune per un indefinite or infinite loop. Si potrebbe volutamente avere un ciclo indefinito se si sta cercando una condizione che non è finita all'inizio - come l'input dell'utente o la fine di un file di dimensioni sconosciute. Potresti anche vedere while(1) o while(true) per la stessa cosa. Si dice 'fare questa cosa {qualunque} fino a quando non c'è più ...'

All'interno di quella struttura ad anello è probabilmente un condizionale e un break statement, come ad esempio:

for(;;) 
{ 
    Console.Write("Enter your selection (1, 2, or 3): "); 
    string s = Console.ReadLine(); 
    int n = Int32.Parse(s); 

    switch (n) 
    { 
     case 1: 
      Console.WriteLine("Current value is {0}", 1); 
      break; 
     case 2: 
      Console.WriteLine("Current value is {0}", 2); 
      break; 
     case 3: 
      Console.WriteLine("Current value is {0}", 3); 
      break; 
     default: 
      Console.WriteLine("Sorry, invalid selection."); 
      break; 
     } 
    if(n==1 || n==2 || n==3) 
     break; // out of the for(;;) loop  

} 

La chiave se esso è " sicuro "o non è per capire la logica di come si lascia quel ciclo, o il tuo ciclo indefinito diventerà un ciclo infinito non intenzionale e un bug.

Ancora dal sito # C per for: HERE

1

Questo è molto comune sui sistemi embedded senza sistema operativo. Se il tuo programma termina, non c'è un sistema sottostante da gestire. Quindi per lo più c'è un enorme ciclo infinito in cui vengono gestite la maggior parte delle operazioni.