To w pewnym sensie odpowiedź pośrednia, ale to pytanie skłoniło mnie do zastanowienia się nad logiką, która za nim stoi, i pomyślałem, że warto się tym podzielić.
Jak wszyscy powiedzieli, do ... while
pętli używasz, gdy chcesz przynajmniej raz wykonać body. Ale w jakich okolicznościach chciałbyś to zrobić?
Cóż, najbardziej oczywistą klasą sytuacji, o których przychodzi mi do głowy, byłaby sytuacja, w której początkowa („niewzbudzona”) wartość warunku sprawdzenia jest taka sama, jak przy wyjściu . Oznacza to, że musisz raz wykonać treść pętli, aby zaliczyć warunek do wartości nieistniejącej, a następnie wykonać rzeczywiste powtórzenie w oparciu o ten warunek. Ponieważ programiści są tak leniwi, ktoś postanowił zawrzeć to w strukturze kontrolnej.
Na przykład odczyt znaków z portu szeregowego z limitem czasu może mieć postać (w Pythonie):
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)
Uwaga powielania kodu: char_read = port.read(1)
. Gdyby Python miał do ... while
pętlę, mógłbym użyć:
do:
char_read = port.read(1)
response_buffer.append(char_read)
while char_read
Dodatkowa korzyść dla języków, które tworzą nowy zakres dla pętli: char_read
nie zanieczyszcza przestrzeni nazw funkcji. Ale pamiętaj również, że istnieje lepszy sposób na zrobienie tego, a jest to użycie None
wartości Pythona :
response_buffer = []
char_read = None
while char_read != '':
char_read = port.read(1)
response_buffer.append(char_read)
response = ''.join(response_buffer)
Więc oto sedno mojego punktu: w językach z pustych rodzaju sytuacja initial_value == exit_value
powstaje znacznie rzadziej, a to może być, dlaczego nie spotykamy go. Nie mówię, że to się nigdy nie zdarza, ponieważ wciąż są chwile, kiedy funkcja wróci, None
aby oznaczyć ważny warunek. Ale w mojej pospiesznej i krótko przemyślanej opinii zdarzyłoby się to znacznie częściej, gdyby używane języki nie pozwalały na wartość, która oznacza: ta zmienna nie została jeszcze zainicjowana.
Nie jest to doskonałe rozumowanie: w rzeczywistości, teraz, gdy wartości zerowe są powszechne, po prostu tworzą jeszcze jeden element zbioru prawidłowych wartości, które zmienna może przyjąć. Praktycznie jednak programiści mają sposób na rozróżnienie między zmienną będącą w stanie rozsądnym, który może obejmować stan wyjścia pętli, a stanem niezainicjalizowanym.