Perché ne vedo così tanti per (;;) costrutti? [chiuso]


14

Secondo il mio modo di pensare, un ciclo for viene usato per iterare su un intervallo noto o determinabile.

String[] names = //something;
for ( int i = 0; i < names.length; i++ ) { //do stuff }

che è equivalente (ambito di i) a parte:

String[] names = //something;
int i = 0;
while (i < names.length )
{
   // do stuff
   i++;
}

In altre parole, il forciclo è semplicemente uno zucchero sintattico (molto utile) per un whilecostrutto comunemente usato .

Tuttavia, sto vedendo molti for(;;)costrutti sul web che sono funzionalmente equivalenti awhile(true)

Qual è il ragionamento per questo? Perché l'infinito per ciclo dovrebbe essere preferito all'infinito ciclo continuo?

// Ho persino visto un libro di testo Java che non usava per niente mentre scorrevo! Portando a tali mostruosi costrutti come:

String input = getInput();
for( ; !inputIsValid(input) ; )
{
   //redo;
}

Il motivo principale è la preferenza. La leggibilità dovrebbe entrare in gioco quando si effettua la scelta, tuttavia YMMV.
Aaron McIver,

Perché qualcuno dovrebbe preferire il costrutto imbarazzante?
Chris Cudmore,

10
Potresti scambiare whilee forqui e la domanda non cambierebbe. while(true)e for(;;)dire la stessa cosa. Ovviamente hai una forte preferenza per while, altri potrebbero avere una preferenza altrettanto forte per for. È impossibile dire che uno è più corretto dell'altro.
Caleb,

3
@chris, non trovo affatto for(;;)confuso. È un linguaggio C standard, che documenterai nella sezione 3.5 di K&R (2e). Capisco che tu non mi piace; si dovrebbe capire che gli altri, ovviamente, preferiscono (altra cosa che non avevo mai vede). Potrebbe essere più o meno accettabile in lingue diverse da C; hai taggato questo linguaggio agnostico che diminuisce solo la possibilità di una risposta definitiva. Ancora una volta, ho votato per chiudere perché la Q non è costruttiva; se fossi offeso, mi sarei contrassegnato come offensivo anziché o in aggiunta alla chiusura. Questo è tutto.
Caleb,

1
Personalmente penso che ci sia una reale opportunità qui per avere un'altra sintassi interamente per loop infiniti: qualcosa del generewheeeeeeee { ... }
detly

Risposte:


33

È un blocco delle vecchie pratiche di programmazione sul PDP-11 (sì, ho detto vecchio ). Ha usato per salvare una singola istruzione, che era utile per rendere i cicli più veloci.

Vedere di seguito per ulteriori informazioni: http://www.flounder.com/exceptions.htm


3
Questo è esattamente quello che stavo cercando. C'è una ragione reale, legittima, ma non è più valida.
Chris Cudmore,

1
@chris Nnnope, i compilatori moderni a volte si lamentano dell'uso di una costante nelle condizioni di un loop. Non è puramente un holdover.
Izkata,

C'è più di questo. Ricordo di aver scritto C nei primi anni '90 su sistemi unix e mentre (true) {} non era un'opzione. Non esisteva un tipo booleano standard, ma diversi sistemi unix si definivano propri nei file di intestazione C. Dalla memoria, almeno un fornitore unix ha definito VERO come zero supplicamente per aiutare a elaborare i ritorni di funzione poiché la convenzione prevedeva di restituire zero in caso di successo e numeri positivi erano errori. Ciò significava che while (TRUE) {} non era portatile.
Michael Shaw,

1
Non riesco a trovarlo in questo momento, ma potrei giurare che qualche anno fa Dennis Ritchie ha scritto un post su Usenet affermando che questo era semplicemente sbagliato, e lui / loro usano la for(;;)sintassi come (secondo loro) una dichiarazione più diretta di intento che non sono stati indicati criteri per l'uscita dal ciclo.
Jerry Coffin,

@Ptolemy: Beh, avresti sicuramente potuto scrivere while(1) { }.
Ed S.

10

alcuni compilatori daranno un avvertimento (qualcosa come l' espressione condizionale è costante ) quando si usa while( 1 )ma con for( ; ; )non c'è nulla di cui avvertire. I programmatori vogliono il codice senza avvisi, quindi usano la variante for.


Tuttavia, alcune cose che i compilatori avvertono sono perfettamente valide e persino (in alcuni casi speciali) inevitabili. Quindi alcuni di noi trattano anche gli avvisi. Se li ignori, ovviamente puoi essere sommerso dalle cose dannate e non vedere quelle importanti, ma ci sono pragmi e opzioni per disabilitare gli avvisi, a livello locale o globale. Fondamentalmente, sì, è meglio non avere avvisi, ma di solito ho bisogno di un motivo più forte di quello per adottare uno stile di codice peggiore. Qui non è peggio solo diverso, ma i loop "infiniti" sono rari (o comunque stile molto cattivo) comunque.
Steve314,

5

È un'abitudine acquisita dalla programmazione C in cui non esiste un tipo booleano. Mentre (1) sarebbe potenzialmente l'equivalente, ma For (;;) è spesso usato come appare in K&R se ricordo bene. Ho il sospetto che ci fosse un motivo hardware anche lì da qualche parte.


4
... sospetto che ci fosse un motivo hardware ...
Aaron McIver il

2
Come menzionato Edward Robertson, il motivo è che il compilatore C sul PDP-11 non si è reso conto che il vero in "while (true)" era una costante di tempo di compilazione e avrebbe aggiunto un'istruzione aggiuntiva (un confronto) durante la generazione di assembly. A causa delle risorse limitate disponibili sul PDP-11, i programmatori hanno usato il ciclo for per ottimizzare quell'istruzione extra fuori dal programma.
Jetti,

3

perché (;;) può essere letto come "per sempre" che alcuni trovano più naturale di "mentre vero".


Sebbene questo non sia il motivo originale, è un motivo secondario per cui la preferenza è rimasta bloccata molto tempo dopo che il motivo originale è diventato obsoleto. Tuttavia, è molto difficile individuare eventuali prove a supporto di questo, oltre a chiedere ai programmatori di lunga esperienza.
DarenW,

-2

Tutti i programmatori esperti che ho chiesto possono riconoscere for(;;)più rapidamente di while(true)o while(1).


2
Qualsiasi programmatore che merita un accidente dovrebbe essere in grado di riconoscerli tutti e tre all'istante. Tutti e tre sono abbastanza comuni che chiunque abbia trascorso più di 5 minuti a leggere il codice ha visto ognuno di loro un sacco di volte.
cHao,

1
Gli studi hanno dimostrato che i programmatori esperti possono comprendere for(;;)14 ms più velocemente di while(1):-)
kevin cline
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.