Perché l'istruzione "do" richiede un "while"? [chiuso]

0

Poiché questa affermazione è così comune:

while (true) (Java)

o

while (1) (C)

o qualche volta

for (;;)

Perché non esiste una singola istruzione per questo? Potrei pensare che un'istruzione che potrebbe farlo sia solo do ma do richiede un while alla fine del blocco ma sarebbe più logico scrivere un ciclo infinito come questo

do {

//loop forever

}

Perché no? AFAIK l'istruzione do richiede sempre un while alla fine, ma se potessimo usarlo come sopra, sarebbe un modo chiaro per definire qualcosa come while (true) che penso non dovrebbe essere scritto in questo modo (o for (;;) ).

    
posta Niklas Rosencrantz 13.10.2013 - 06:54
fonte

10 risposte

6

Questo è dovuto in gran parte al fatto che la creazione di un comando separato non sarebbe necessaria . L'aggiunta di comandi extra non necessari a un linguaggio di programmazione è spesso considerata di scarsa progettazione. Perché creare un'istruzione speciale quando ne esiste già una che funziona?

La tua idea di avere solo una delle coppie "do / while" è come funziona in altre lingue , come Python , ad esempio, poiché Python non avendo le parentesi di chiusura di cui preoccuparsi.

while True:
    ...

È semplicemente una questione di come qualsiasi lingua data è progettata . Ricorda che i linguaggi di programmazione sono cose create dall'uomo - possono assumere qualsiasi forma noi, come esseri umani, progettiamo da prendere. Potresti creare il tuo linguaggio che segue il principio che desideri, se ritieni che sia stato abbastanza importante.

    
risposta data 13.10.2013 - 08:13
fonte
4

I linguaggi di programmazione sono ancora lingue e, quando si traduce il codice dall'inglese al linguaggio di programmazione X, potrebbe essere necessario modificare alcuni idiomi, riordinare parole, frasi o includere talvolta parentesi graffe impronunciabili ...

Quando vuoi un ciclo infinito, è possibile utilizzare while (true) o i suoi equivalenti. Senza buone ragioni, nessun designer di linguaggio aggiungerà un'altra parola chiave solo per cicli infiniti.

La tua idea che do { ... } implichi sempre una percentuale finale diwhile ... non regge. In Ruby, do avvia un blocco di codice e in Perl consente di utilizzare un blocco di codice a livello di espressione:

# read a whole file at once
my $file_contents = do {
  local $/;
  open my $fh, "<", $filename or die "Can't open $filename: $!";
  <$fh>;
};

Poiché do è sempre un'espressione, è possibile utilizzare anche vari altri modificatori di istruzioni ( if , unless e parole chiave con involucro speciale per valutare il blocco una volta prima di testare la condizione: while e until ).

Perl6 è interessante qui perché rinomina lo stile C for con la parola chiave loop . Le varie istruzioni come l'inizializzazione sono opzionali, quindi si può scrivere:

loop {
  say "hi";
}

... che è uguale a say "hi" while True .

Usa solo while (true) - tutti lo capiranno. for(;;) è anche un idioma ampiamente compreso . Se stai usando una lingua con un preprocessore, potresti anche fare cose cattive come #define forever for(;;) , ma questo riduce la manutenibilità.

    
risposta data 13.10.2013 - 12:48
fonte
2

Suppongo che i progettisti di linguaggi siano interessati ad aiutare gli sviluppatori a scrivere codice accurato. Una lingua potrebbe preferire non introdurre un costrutto che porta a un ciclo infinito senza che lo sviluppatore lo richieda esplicitamente. Un linguaggio come REXX prende ulteriormente questo concetto e introduce un ciclo per sempre come in:

do forever
...
end

Quindi, per rispondere alla tua domanda i motivi potrebbero essere:

  1. Per aiutare gli sviluppatori a scrivere codice migliore.

  2. Per essere simile ad altre lingue popolari.

  3. Per utilizzare un singolo costrutto anziché diversi.

risposta data 13.10.2013 - 16:10
fonte
1

Direi che mentre è più esplicito di quello che faccio. Nella programmazione è spesso utile essere espliciti. Questo si traduce in un codice che è più facile da leggere. Con la proposta do loop while la (vera) porzione o condizione è ancora implicita.

Quindi, per riassumere, direi che è perché la maggior parte delle lingue sono progettate per essere esplicite e leggibili.

    
risposta data 13.10.2013 - 14:49
fonte
1

do/while è semanticamente diverso da for e while in quanto la condizione è selezionata dopo il corpo del ciclo è stato eseguito, non prima. La struttura do { ... } while(condition) rende chiaro questo comportamento. Ora, dmr potrebbe aver usato un metodo diverso per trasmettere la stessa semantica, come

until ( condition ) { ... }

ma non è chiaro (per me, comunque) che condition sia valutato alla fine del ciclo.

Per un ciclo infinito non ha importanza; usa solo for(;;) (che credo sia più idiomatico di while(1) ).

    
risposta data 11.11.2013 - 23:04
fonte
1

Quale dovrebbe essere il significato di:

do
{
  doThis();
  doThat();
  if(shouldExit())
    break();
  theOtherThing();
}
while(read_data() != null)
  ;

Se fosse stata usata qualche altra parola chiave per esprimere la condizione di continuazione di un ciclo do (come con Repeat ... Until di Pascal) allora sarebbe stato possibile rendere facoltativa la condizione di continuazione. Tuttavia, com'è possibile, while(condition); può apparire come l'ultima cosa in un do / while o come un ciclo autonomo. Qualcosa deve apparire tra l'istruzione controllata di do / while e un'istruzione autonoma successiva, ed è più semplice semplicemente che something sia sempre una clausola while(expr); .

    
risposta data 24.08.2014 - 01:30
fonte
0

La mia ipotesi è: per nessun motivo specifico diverso dai gusti personali dei progettisti di linguaggi.

Alcune lingue, come PL / SQL, Ada, Common Lisp, Perl6 e Go (come hanno dimostrato amon e topskip) hanno una struttura di loop che si estende all'infinito se usata da sola, ma può essere estesa facoltativamente con diverse clausole, come while, until, initialization, increments, ecc.

Molto probabilmente i progettisti di C pensavano che per + while + do / mentre erano gli idiomi più utili e poi C ++, Java e altri hanno appena copiato le istruzioni del ciclo, preferendo concentrare i loro sforzi di progettazione su altre funzionalità linguistiche, come l'orientamento degli oggetti .

In altre parole, non credo che i linguisti pensino che sia una brutta caratteristica, è solo che alla fine devi smettere di aggiungere funzionalità, e c'è una solida tradizione nei linguaggi basati su C di avere + e + fare / mentre . In altre lingue, la funzione che hai suggerito esiste ed è utile.

    
risposta data 11.11.2013 - 23:32
fonte
0

Prova:

there:
    ........
    goto there;

Ma in realtà "while (true)" è chiaro e conciso.

Un nudo "mentre" è ambiguo, perché dovrebbe significare un loop per sempre. Logicamente il suo "mentre niente" che ti porta a non andare mai lì.

Allo stesso modo un "do" nudo implicherebbe "fare una volta". Se qualcuno ti chiede di "lavare i piatti" li lavi una volta, non li lavi più e più volte finché qualcuno non ti chiede di fermarti.

Forse, ancora più importante, un ciclo infinito è una cosa importante da notare se stai cercando di capire una logica di programmazione, dovrebbe avere una sintassi evidente e non è passata facilmente una sola parola.

    
risposta data 12.11.2013 - 02:53
fonte
0

I loop infiniti sono generalmente considerati cattivi pratcice, e quindi non avrebbe senso includere una sintassi dedicata per loro in una lingua. La sintassi speciale (o "zucchero sintetico") viene aggiunta per attività comuni, come un blocco unless oltre a un blocco if , per rendere il codice più "amichevole" e leggibile.

Poiché i loop infiniti sono piuttosto rari e sono generalmente considerati cattivi, non sarebbe una buona idea supportarli in una lingua tramite una sintassi dedicata.

    
risposta data 24.08.2014 - 01:51
fonte
0

Dal mio punto di vista usare do ... mentre creare loop infiniti porta a un codice difficile da mantenere. Quando incontri un do devi scorrere fino in fondo per vedere se è un loop infinito o no. D'altra parte usare per (;;) o mentre (1) all'inizio del ciclo è molto più chiaro. Come già accennato, puoi ancora creare loop infiniti con il design attuale della lingua in modo da non doverlo modificare. Dal momento che non c'è una reale necessità di cambiare il design nella lingua, nessuno lo sta effettivamente cambiando.

    
risposta data 24.08.2014 - 08:16
fonte

Leggi altre domande sui tag