"For (;;)" è più veloce di "while (TRUE)"? In caso contrario, perché le persone lo usano?


164
for (;;) {
    //Something to be done repeatedly
}

Ho visto questo genere di cose usate molto, ma penso che sia piuttosto strano ... Non sarebbe molto più chiaro da dire while(true), o qualcosa del genere?

Immagino che (com'è la ragione per cui molti programmatori ricorrono al codice criptico) questo è un piccolo margine più veloce?

Perché e ne vale davvero la pena? In tal caso, perché non definirlo in questo modo:

#define while(true) for(;;)

Vedi anche: Quale è più veloce: while (1) o while (2)?


51
Cosa è TRUE???
AnT

20
@Steven Sudit: cosa TRUEc'entra con C? La macro standard per il vero risultato boolen in C99 è ancora true. Da dove TRUEviene?
AnT

31
Quella macro non funziona, #define EVER ;;è stata usata in IOCCC però .. :)

18
#define while(TRUE)Quella macro non è per dichiarare una macro che prende un argomento chiamato TRUEche non viene mai usata, trasformando quindi ogni singolo ciclo while del programma in un ciclo infinito?
AshleysBrain,

9
@Steven Sudit: No. Non esiste una "macro standard in VS 6.0". La macro TRUEproviene da file di intestazione associati all'API di Windows. Non è in alcun modo correlato a VS 6.0. E, come ho detto prima, non ha nulla a che fare con C o C ++. In C ++ il letterale "vero" è giusto true(anche in VS 6.0), in C89 / 90 non esiste nulla del genere e in C99 è macro true. Questo vale per tutti i compilatori C / C ++.
AnT

Risposte:


262
  1. Non è più veloce
  2. Se ti interessa davvero, compila con l'output dell'assemblatore per la tua piattaforma e guarda per vedere.
  3. Non importa Questo non ha mai importanza. Scrivi i tuoi loop infiniti come preferisci.

227
Intuitivamente, l'ottimizzazione di un loop infinito offre il potenziale per una velocità infinita. Per fortuna non programmiamo sull'intuizione, quindi. :-)
Steven Sudit

5
Suppongo tu abbia ragione. Penso di essere stato coinvolto in dibattiti "religiosi" su piccole cose. Grazie per aver scosso la mia coscienza libera. : D
Chris Cooper,

6
@Steven LOL, questo è interessante, ma poi considera che l'unico scenario in cui hai effettivamente raggiunto quel potenziale di accelerazione infinita è quando il loop non si interrompe mai e funziona davvero all'infinito, il che è probabilmente un bug o, se previsto, sarà un'attesa infinita prima che raggiunga quel potenziale.
AaronLS

7
@Chris. Nella programmazione come nella vita, i dibattiti religiosi valgono solo il tuo tempo per le cose che contano davvero. Questa non è una di quelle cose. Come puoi vedere, ognuno ha un modo semplice per scrivere un ciclo infinito. Scegli tutto ciò che ti rende più felice per le piccole cose, quindi esegui il tuo profiler sul codice che conta. :)
Ben Zotto

3
Importava, dal momento che alcuni primi compilatori su alcune piattaforme caricavano una costante e ne facevano un salto condizionato. Che a quei tempi l'hardware contava.
Peter

176

Preferisco for(;;)per due motivi.

Uno è che alcuni compilatori generano avvisi while(true)(qualcosa come "condizione del loop è costante"). Evitare gli avvisi è sempre una buona cosa da fare.

Un altro è che penso for(;;)sia più chiaro e più significativo. Voglio un ciclo infinito. Letteralmente non ha condizioni, non dipende da nulla. Voglio solo che continui per sempre, fino a quando non faccio qualcosa per uscirne.

Mentre con while(true), beh, cosa c'entra la verità con qualcosa? Non mi interessa il looping fino a quando true non diventa falso, che è ciò che dice letteralmente questa forma (loop mentre true è vero). Voglio solo fare un giro.

E no, non c'è assolutamente alcuna differenza di prestazioni.


73
+1 per evitare avvisi. Ma per quanto riguarda la chiarezza, trovo che sia più chiaro che per in questo contesto. Immagino che questo aspetto dipenda solo dalle preferenze personali.
Tim

14
Sì, preferenza e abitudine. Se non sei abituato a vedere for(;;), sembrerà ovviamente strano. Ma consiglierei di provare ad abituarmi perché è un linguaggio comune e ci si imbatterà di nuovo in esso. ;)
jalf

7
Il commento di jalf sull'essere idiomatico è davvero la risposta qui. È comunemente usato per "loop infinito" semplicemente perché è il modo comunemente usato per scrivere "loop infinito" in C. Non ci deve essere una buona ragione per un idioma - è solo una convenzione che si rinforza da sola.
Caf

7
@Steve: non vedo perché mai dovrei usare for(;condition;). Questo è ciò che un ciclo while è per . Ma come ho detto, con un ciclo infinito, non voglio davvero che il compilatore paragona alcuna condizione. Ingenuamente, con un whileciclo, dovrebbe testare trueogni iterazione (ovviamente, nemmeno il compilatore più stupido lo farebbe, ma è il principio che mi dà fastidio. Mi sembra troppo specifico per il tuo codice), mentre con un for(;;)stai letteralmente dicendo "Non c'è alcuna condizione da testare. Solo loop". Lo trovo l'equivalente più vicino al tuo immaginarioloop {...}
jalf

32
Il compilatore fa schifo se while(true)dà un avviso.
Albert,

56

Personalmente lo uso for (;;)perché non ci sono numeri, è solo una parola chiave. Lo preferisco a while (true), while (1), while (42), while (!0)etc etc.


38
0, 1 e infinito sono numeri magici accettabili, estendere 0 e 1 su falso e vero non è una perdita. truenon è più un numero magico di foruna parola chiave magica o for(;;)utilizza un infinito magico implicito. ( while (42)è davvero un abominio.)

38
Tangente: uno dei miei professori CS ha detto "ci sono solo tre numeri in programmazione: 0, 1 e n. Qualsiasi altra cosa è chiamata un numero magico".
Ben Zotto,

21
while (42) è il più cool, non produce risultati diversi rispetto a while (1) o while (true) o while (! 0) e ha un significato filosofico . Suppongo che for(;;)sia analizzato più velocemente degli altri
ShinTakezou,

2
@ShinTakezou molto meglio #define LIFE 42 while (LIFE):)
mr5

1
bene while(true)non contiene alcun numero anche. e per (;;) non è una parola chiave
RiaD

49

Per colpa di Dennis Ritchie

  • Ho iniziato a usarlo for (;;)perché è così che fa Dennis Ritchie in K&R, e quando imparo una nuova lingua cerco sempre di imitare i ragazzi intelligenti.

  • Questo è idiomatico C / C ++. A lungo termine è probabilmente meglio abituarsi se si prevede di fare molto nello spazio C / C ++.

  • Il tuo #definenon funzionerà, dal momento che la cosa che si definisce # deve apparire come un identificatore C.

  • Tutti i compilatori moderni genereranno lo stesso codice per i due costrutti.


10
Sì, è così che sai che qualcuno ha imparato C da K&R, nel modo in cui dovrebbe essere appreso. Ogni volta che vedo while(TRUE), sospetto che il programmatore sia un principiante C, o abbia imparato C da un libro For Dummies.
Kristopher Johnson,

13
Ho sentito che anche i neofiti usano lo stile di definizione delle funzioni newfangled .
Giustino,

46

Non è certamente più veloce in nessun compilatore sano di mente. Entrambi saranno compilati in salti incondizionati. La versione for è più facile da digitare (come ha detto Neil) e sarà chiara se si capisce la sintassi del loop.

Se sei curioso, ecco cosa mi dà gcc 4.4.1 per x86. Entrambi usano l' istruzione x86 JMP .

void while_infinite()
{
    while(1)
    {
    puts("while");
    }
}

void for_infinite()
{
    for(;;)
    {
    puts("for");
    }
}

compila in (in parte):

.LC0:
.string "while"
.text
.globl while_infinite
    .type   while_infinite, @function
while_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L2:
    movl    $.LC0, (%esp)
    call    puts
    jmp .L2
    .size   while_infinite, .-while_infinite
    .section    .rodata
.LC1:
    .string "for"
    .text
.globl for_infinite
    .type   for_infinite, @function
for_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L5:
    movl    $.LC1, (%esp)
    call    puts
    jmp .L5
    .size   for_infinite, .-for_infinite

Dubito che sia più veloce anche in modalità debug.
Steven Sudit,

106
for_infiniteè più veloce; 2 caratteri in meno a puts.
Dave Jarvis,

43

Preferisco for (;;)perché è il più coerente in diversi linguaggi simili a C.

In C ++ while (true)va bene, ma in C dipende da un'intestazione da definire true, ma TRUEè anche una macro comunemente usata. Se lo usi while (1)è corretto in C e C ++ e JavaScript, ma non Java o C #, che richiedono che la condizione del ciclo sia booleana, come while (true)o while (1 == 1). In PHP, le parole chiave non fanno distinzione tra maiuscole e minuscole, ma la lingua preferisce la maiuscola TRUE.

Tuttavia, for (;;)è sempre completamente corretto in tutte quelle lingue.


9
Grazie per la tua risposta! Penso che questa sia in realtà la prima risposta che mostra un modo oggettivo che for (;;)è migliore.
Chris Cooper,

8
Non credo di aver mai bisogno di scrivere codice corretto in C, C ++, JavaScript, Java e C #. Sono lingue diverse.
Keith Thompson,

6
@KeithThompson non si tratta di scrivere codice che sia corretto in molte lingue; penso che si tratti di evitare interpretazioni errate tra sviluppatori con background diversi.
Mauro Sampietro,

6
@sam: Entrambi while (1)e for (;;)sono modi di dire comuni per infiniti loop in C. Chiunque legga un programma C che ha difficoltà a capire, probabilmente avrà problemi con il resto del codice. Non vale la pena scrivere un codice C che può essere facilmente letto da qualcuno che non conosce C.
Keith Thompson,

6
@KeithThompson Mentre un lettore competente di C dovrebbe sicuramente avere familiarità con entrambi i modi di dire, questo potrebbe anche essere utile se lo scrittore è un programmatore poliglotta. Nel mio ultimo lavoro ho lavorato quotidianamente in JS, ActionScript e PHP, e unificare il modo in cui si scrive il codice (dove ha senso farlo) può rendere la programmazione più veloce e la manutenzione più semplice.
Ionoclast Brigham,

21

Personalmente preferisco il for (;;)linguaggio (che verrà compilato con lo stesso codice di while (TRUE).

L'uso while (TRUE)può essere più leggibile in un certo senso, ho deciso di usare il for (;;)linguaggio perché si distingue .

Un costrutto a ciclo infinito dovrebbe essere facilmente notato o richiamato nel codice, e personalmente penso che lo for (;;)stile lo faccia un po 'meglio di while (TRUE)o while (1).

Inoltre, ricordo che alcuni compilatori emettono avvisi quando l'espressione di controllo di un ciclo while è una costante. Non penso che ciò accada troppo, ma solo il potenziale di avvertimenti spuri è sufficiente per volerlo evitare.


17

Ho visto alcune persone preferirlo perché hanno un #define da qualche parte come questo:

#define EVER ;;

Che consente loro di scrivere questo:

for (EVER)
{
    /* blah */
}

24
L'ho visto anche io; ma non è un buon motivo per preferirlo. Come manutentore, dovresti comunque controllare la definizione della macro per essere certo che abbia fatto quello che ti aspettavi, mentre il codice originale era abbastanza chiaro. RTOS VxWorks ha una macro FOREVERdefinita for(;;), ma non è meglio. Le macro IMO non devono essere utilizzate per "inventare" una nuova lingua.
Clifford,

8
In realtà lo scopo delle macro in alcune lingue è inventare una nuova sintassi. Ma indipendentemente da "for (EVER)" in C / C ++ è atroce.
Dan Olson,

15
Alcune persone fanno cose divertenti, come se a loro piace Pascal che dicono #define BEGIN {e #define END }. Ho anche visto #define DONKEYS_FLY (0)così possono dire if DONKEYS_FLY .... Chi dice che il software sia noioso?
Mike Dunlavey,

11
In California ti credo che devi #define per (;;) LIKE_FOREVER
Martin Beckett,

1
Non ho resistito: #define never while(0)e#define always
alfC

16

Che dire (se la tua lingua lo supporta):

start:
/* BLAH */
goto start;

... che dovrebbe generare un output identico nelle mani di qualsiasi compilatore ragionevole.
Ben Zotto,

9
+1! Non migliora gotoi numerosi svantaggi ma, se l'algoritmo che stai tentando di implementare proviene da un diagramma di flusso, questa è la traduzione più diretta.
Edmund,

4
Personalmente, ho una visione utilitaristica su goto. Non ci sono rapaci. I rapaci sono persone. Ed erano le persone che hanno iniziato a usare goto per creare il codice spaghetti. Inoltre, l'output assemblato per un loop sembra più o meno così. Le serie di istruzioni per i computer non hanno concetti di "for" o "while", semplicemente "jump".
josaphatv,

mai e poi mai usaregoto
Edward Karak

La cosa davvero bella gotoè che non devi preoccuparti che qualcuno aggiunga un breakper rendere il tuo ciclo meno infinito. (a meno che tu non sia già dentro un altro whileo un forciclo ovviamente ...)

12

Non c'è alcuna differenza in termini di codice macchina che viene generato.

Tuttavia, solo per invertire la tendenza, direi che la forma while (TRUE) è molto più leggibile e intuitiva rispetto a (;;), e che la leggibilità e la chiarezza sono motivi molto più importanti per le linee guida di codifica rispetto a qualsiasi motivo io ' ho sentito l'approccio for (;;) (preferisco basare le mie linee guida sulla codifica su solidi ragionamenti e / o prove di efficacia me stesso).


6
Dipende dalla tua lingua. for(;;)è il modo tradizionale per farlo in C e C ++. while(true)sembra essere la convenzione in C #, Java e altre lingue. Il tuo chilometraggio può variare.
Billy ONeal

9
Sì, e qualcuno che non ha molta familiarità con C o C ++ potrebbe trovare STRING_SCAN_FORMATTED più leggibile di sscanf, ma non vedi nessuno mettere #define STRING_SCAN_FORMATTED in cima al loro codice.
ta.speot.is

4
Direi che il modo idiomatico di farlo sarebbe meglio essere il più leggibile per il tuo sviluppatore. Altrimenti hai davvero bisogno di sviluppatori migliori.
jalf

5
@despart: se qualcuno non ha abbastanza familiarità con il C ++ per riconoscere quell'idioma per quello che è, allora devono stare alla larga dalla mia base di codice.
Billy ONeal

4
Concordo sul fatto che il modo idiomatico dovrebbe essere il più leggibile. Questo è il motivo per cui i modi idiomatici hanno sempre bisogno di essere sfidati e cambiati con l'evoluzione delle lingue e delle pratiche. Ci sono voluti anni perché il terribile stile di codifica "idiomatica" di K&R venisse sostituito dallo stile moderno e più leggibile, ma continuava a succedere.
Jason Williams,

11

Non solo un modello ben noto, ma un linguaggio standard in C (e C ++)


3
Sì, e penso che alcuni compilatori avvertano while (true)per lo stesso motivo per cui lo fanno if (true).
Steven Sudit,

11
while(true)

genera un avviso con Visual Studio (la condizione è costante). La maggior parte dei posti in cui ho lavorato compilano build di produzione con avvisi come errori. Così

for(;;)

è preferito.


7
quale versione di Visual Studio stai usando? Con il 2008 non ricevo questo avviso, nemmeno al livello di avviso 4.
Jörgen Sigvardsson il

11

Entrambi dovrebbero essere gli stessi se il tuo codice è ottimizzato dal compilatore. Per spiegare cosa intendo per ottimizzazione, ecco un codice di esempio scritto in MSVC 10:

int x = 0;

while(true) // for(;;)
{
    x +=1;

    printf("%d", x);
}

Se lo costruisci in modalità Debug ( senza alcuna ottimizzazione (/ Od) ) lo smontaggio mostra la chiara differenza. Ci sono ulteriori istruzioni per la truecondizione all'interno while.

while(true)
00D313A5  mov         eax,1                //extra 
00D313AA  test        eax,eax              //extra
00D313AC  je          main+39h (0D313B9h)  //extra
    {
        x +=1;
00D313AE  mov         eax,dword ptr [x]  
00D313B1  add         eax,1  
00D313B4  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D313B7  jmp         main+25h (0D313A5h)  


for(;;)
    {
        x +=1;
00D213A5  mov         eax,dword ptr [x]  
00D213A8  add         eax,1  
00D213AB  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D213AE  jmp         main+25h (0D213A5h)  

Tuttavia, se si crea il codice in modalità di rilascio (con la velocità di massimizzazione predefinita (/ O2) ) si ottiene lo stesso output per entrambi. Entrambi i loop sono ridotti a un'istruzione di salto.

for(;;)
    {
        x +=1;
01291010  inc         esi  

        printf("%d", x);
    ...
    }
0129101C  jmp         main+10h (1291010h)  

    while(true)
    {
        x +=1;
00311010  inc         esi  

        printf("%d", x);
    ...
    }
0031101C  jmp         main+10h (311010h)  

Qualunque cosa tu usi, non importa per un compilatore decente con l'ottimizzazione della velocità attiva.


Questo è in realtà un ottimo punto! Senza ottimizzazione anche i compilatori moderni differiranno per diverse istruzioni.

9

È una questione di preferenze personali in che modo è più veloce. Personalmente, sono un touchtypist e non guardo mai la mia tastiera, durante la programmazione - posso toccare tutti i 104 tasti della mia tastiera.

Trovo più veloce digitare "while (TRUE)".

Ho aggiunto mentalmente alcune misurazioni del movimento delle dita e le ho sommate. "for (;;)" ha circa 12 larghezze di chiave dei movimenti indietro e quarta (tra i tasti home e le chiavi e tra i tasti home e il tasto SHIFT) "mentre (TRUE)" ha circa 14 larghezze di chiave dei movimenti indietro e il quarto.

Tuttavia, sono immensamente meno soggetto a errori durante la digitazione di quest'ultimo. Penso mentalmente alle parole alla volta, quindi trovo più velocemente digitare cose come "nIndex" rispetto agli acronimi come "nIdx" perché devo effettivamente scrivere mentalmente le lettere piuttosto che parlarle nella mia mente e lasciare che le mie dita si auto -tipo la parola (come andare in bicicletta)

(Benchmark My TypingTest.com = 136 WPM)


3
Credo che l'OP si riferisse alla velocità di runtime, non alla velocità di battitura.

Lo so. Dovevo solo coprire anche quella base.
Mark Rejhon,

7
s / preferenza personale / abitudine individuale /
SamB

@SamB: commento up-voto per s ///. xD E sì, anche se ho suggerito che potrebbe essere dovuto alla velocità di runtime, non sapevo la risposta effettiva. Se fosse così, sarei stato felice.
Chris Cooper,

Esegui time head -10 >/dev/null, digita ogni 10 volte e misura i risultati. Scommetto che sarai più veloce for(;;)se non imbroglia. Ero del 14% circa.
PSkocik,

6

Tutte le risposte valide: il comportamento dovrebbe essere esattamente lo stesso.

TUTTAVIA - Supponiamo solo che abbia fatto la differenza. Supponiamo che uno di loro abbia preso altre 3 istruzioni per iterazione.

Dovrebbe interessarti?

SOLO se ciò che fai all'interno del loop è quasi nulla , cosa che non accade quasi mai .

Il mio punto è che ci sono micro-ottimizzazione e macro-ottimizzazione. La micro-ottimizzazione è come "ottenere un taglio di capelli per perdere peso".


3
Con quale frequenza si vede la gente ha detto di preferire ++isopra i++?
Dennis Zickefoose,

7
@Dennis Zickefoose: la differenza tra ++ie i++può essere potenzialmente significativa se si itratta di un'istanza di una classe anziché di un built-in e il compilatore non applica l'ottimizzazione banale. Il consiglio è di acquisire un'abitudine in modo che non ti colga quando conta.
Clifford,

5
Il vantaggio di ++ivs i++è che non ti costa nulla per "ottimizzare". È vero, nella maggior parte dei casi non fa assolutamente alcuna differenza, ma sono ugualmente facili da digitare, quindi perché non preferire il potenzialmente più efficiente di default? E suppongo che lo stesso valga qui. Se uno era un po 'più veloce dell'altro, perché non scegliere quello più veloce? Cosa perderemmo facendolo? Entrambi sono abbastanza facili da leggere e da scrivere.
jalf

2
@Dennis Zickefoose: hai ragione. Lo vedo molto su SO, e il commento di Clifford è giusto. Inoltre, c'è qualcosa che non vedo un sacco su SO, e che è come fare macro-ottimizzazione, come un aumento di velocità 43x: stackoverflow.com/questions/926266/... . Quindi mi chiedo quali siano le nostre priorità.
Mike Dunlavey,

2
@ Mike: Sì, ma questo è un confronto dalle mele alle arance. Ottenere un taglio di capelli richiede tempo reale e probabilmente anche denaro. Sono d'accordo che è una tale microottimizzazione che non importa davvero. Ma non ci costa nulla. se posso scegliere di andare a sinistra o a destra, e la distanza è la stessa, il terreno è lo stesso, tutto è uguale, tranne che il percorso a sinistra ha qualche vantaggio microscopico marginale, perché non andare a sinistra? Hai ragione, non è un argomento impressionante. Ma quando il costo è letteralmente zero, non vedo alcun motivo per preferire il percorso meno ottimale.
jalf

5

Non riesco a immaginare che un compilatore utile genererebbe un codice diverso. Anche se così fosse, non ci sarebbe modo di determinare senza testare il compilatore specifico che era più efficiente.

Tuttavia ti consiglio di preferire for(;;)per i seguenti motivi:

  • un certo numero di compilatori che ho usato genererà un avviso di espressione costante per while (true) con le impostazioni appropriate del livello di avviso.

  • nel tuo esempio la macro TRUE potrebbe non essere definita come previsto

  • ci sono molte possibili varianti del ciclo while quali while(1), while(true), while(1==1)ecc .; quindi for(;;)è probabile che si traduca in una maggiore coerenza.


VERO potrebbe non essere #define VERO 1, ma qualsiasi base di codice in cui while(TRUE)valuta come while(0)probabilmente non trarrà beneficio for(;;).
Giustino,

@Justin: Sono d'accordo, sarebbe davvero perverso, e non è il più forte dei tre argomenti, ma Bjarne Stoustrup usa un argomento simile per evitare la macro NULL in C ++. while(true)dovrebbe essere preferito in ogni caso. In C ++ boolè riservato e in C definito in C stdbool.h (rendendolo meno sicuro in C). for(;;)rimuove tutti i dubbi.
Clifford,

5
for(;;Sleep(50))
{
    // Lots of code
}

È più chiaro di:

while(true)
{
    // Lots of code
    Sleep(50);
}

Non che ciò si applichi se non lo stai utilizzando Sleep().


1
È un codice dannatamente cattivo, il timer dovrebbe essere usato al posto del sonno, quindi è un cattivo esempio
ST3

12
@ ST3 - Sì, hai ragione. Il mio codice è orribile. La prossima volta dovrei provare di più a fare un ciclo infinito.
Armada,

1
@Frammo - dipende dal tuo sistema operativo, ma di solito qualcosa del generetimerService.scheduleRepeating (50, [] () { /* lots of code */ });
Periata Breatta

2
Non c'è nulla di pulito nel chiamare una funzione come sleep all'interno di un ciclo for così
Greg

1
OMG, timerService.scheduleRepeating (50, [] () {}) è semplicemente molto più facile da scrivere e comprendere, quindi in modalità sleep (50).
Raffreddare Javelin l'

4

Il ciclo "per sempre" è popolare nei sistemi embedded come un ciclo in background. Alcune persone lo implementano come:

for (; ;)
{
 // Stuff done in background loop
}

E a volte è implementato come:

while (TRUE /* or use 1 */)
{
 // Stuff done in background loop
}

E ancora un'altra implementazione è:

do
{
 // Stuff done in background loop
} while (1 /* or TRUE */);

Un compilatore di ottimizzazione dovrebbe generare lo stesso o simile codice assembly per questi frammenti. Una nota importante: il tempo di esecuzione dei loop non è una grande preoccupazione poiché questi loop durano per sempre e nella sezione di elaborazione viene dedicato più tempo.


8
Se un compilatore genera un codice diverso per quelli, è tempo di abbandonare il compilatore e ottenerne uno degli ultimi due decenni.
GManNickG

5
"il tempo di esecuzione dei loop non è una grande preoccupazione poiché questi loop continuano all'infinito" - mi sembra così sbagliato ..
Blindy,

3
@Blindy - poiché è sbagliato, ciò che preoccupa è la frazione di runtime impiegata nell'elaborazione della logica di loop o la quantità di logica di loop per unità di lavoro utile, nessuna delle quali è aiutata dal fatto che il loop è infinito
Ben Voigt

3

Suppongo che (true) sia più leggibile che per (;;) - sembra che il programmatore non abbia qualcosa nel ciclo :)


Mi interessa la velocità. Soprattutto se esiste un'ottimizzazione che influenzerà il mio codice infinite volte.
Kowalski,

2

Il motivo più importante per usare "for (;;)" è la paura di usare "while (TRUE)" durante la programmazione esplorativa. È più facile controllare la quantità di ripetizioni con "for" e anche, più facile convertire il ciclo "for" in un infinito.

Ad esempio, se si sta costruendo una funzione ricorsiva, è possibile limitare la quantità di chiamate alla funzione prima di convertirla in un ciclo infinito.

    for(int i=0;i<1000;i++) recursiveFunction(oneParam);

Quando sono sicuro della mia funzione, la converto in un ciclo infinito:

    for(;;) recursiveFunction(oneParam);

3
Il primo ciclo ha un errore di sintassi (manca un punto e virgola).
Jens,

3
Ha! Dimostrando così il rovescio della medaglia di per (;;);)
Andrew
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.