Questa è una sorta di risposta indiretta, ma questa domanda mi ha fatto riflettere sulla logica che c'è dietro e ho pensato che valesse la pena condividerla.
Come tutti gli altri hanno detto, usi un do ... while
ciclo quando vuoi eseguire il corpo almeno una volta. Ma in quali circostanze vorresti farlo?
Ebbene, la classe di situazioni più ovvia a cui riesco a pensare sarebbe quando il valore iniziale ("non adescato") della condizione di controllo è lo stesso di quando vuoi uscire . Ciò significa che è necessario eseguire il corpo del ciclo una volta per innescare la condizione su un valore non esistente, quindi eseguire la ripetizione effettiva in base a quella condizione. Dato che i programmatori sono così pigri, qualcuno ha deciso di avvolgerlo in una struttura di controllo.
Quindi, ad esempio, la lettura di caratteri da una porta seriale con un timeout potrebbe assumere la forma (in Python):
response_buffer = []
char_read = port.read(1)
while char_read:
response_buffer.append(char_read)
char_read = port.read(1)
# When there's nothing to read after 1s, there is no more data
response = ''.join(response_buffer)
Si noti la duplicazione del codice: char_read = port.read(1)
. Se Python avesse un do ... while
ciclo, avrei potuto usare:
do:
char_read = port.read(1)
response_buffer.append(char_read)
while char_read
Il vantaggio aggiuntivo per i linguaggi che creano un nuovo ambito per i cicli: char_read
non inquina lo spazio dei nomi della funzione. Ma nota anche che c'è un modo migliore per farlo, e cioè usando il None
valore di Python :
response_buffer = []
char_read = None
while char_read != '':
char_read = port.read(1)
response_buffer.append(char_read)
response = ''.join(response_buffer)
Quindi ecco il punto cruciale: nelle lingue con tipi nullable, la situazione si initial_value == exit_value
presenta molto meno frequentemente, e questo potrebbe essere il motivo per cui non la incontri. Non sto dicendo che non succede mai, perché ci sono ancora momenti in cui una funzione tornerà None
a significare una condizione valida. Ma a mio parere frettoloso e sommariamente considerato, ciò accadrebbe molto di più se le lingue che hai usato non permettessero un valore che significa: questa variabile non è stata ancora inizializzata.
Questo non è un ragionamento perfetto: in realtà, ora che i valori nulli sono comuni, formano semplicemente un elemento in più dell'insieme di valori validi che una variabile può assumere. Ma in pratica, i programmatori hanno un modo per distinguere tra una variabile che si trova in uno stato sensibile, che può includere lo stato di uscita dal loop, ed è in uno stato non inizializzato.