Это своего рода косвенный ответ, но этот вопрос заставил меня задуматься о его логике, и я подумал, что этим стоит поделиться.
Как уже говорили все, вы используете do ... while
цикл, когда хотите выполнить тело хотя бы один раз. Но при каких обстоятельствах вы бы хотели это сделать?
Что ж, наиболее очевидный класс ситуаций, которые я могу придумать, - это когда начальное («незаштрихованное») значение условия проверки совпадает с тем, когда вы хотите выйти . Это означает, что вам нужно выполнить тело цикла один раз, чтобы заполнить условие несуществующим значением, а затем выполнить фактическое повторение на основе этого условия. Из-за того, что программисты были такими ленивыми, кто-то решил заключить это в структуру управления.
Так, например, чтение символов из последовательного порта с таймаутом может принимать форму (в 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)
Обратите внимание на дублирование кода: char_read = port.read(1)
. Если бы у Python был do ... while
цикл, я мог бы использовать:
do:
char_read = port.read(1)
response_buffer.append(char_read)
while char_read
Дополнительное преимущество для языков, создающих новую область видимости циклов: char_read
не загрязняет пространство имен функции. Но обратите внимание, что есть лучший способ сделать это - использовать None
значение Python :
response_buffer = []
char_read = None
while char_read != '':
char_read = port.read(1)
response_buffer.append(char_read)
response = ''.join(response_buffer)
Итак, вот суть моей мысли: в языках с типами, допускающими значение NULL, ситуация initial_value == exit_value
возникает гораздо реже, и , возможно, поэтому вы с ней не сталкиваетесь. Я не говорю, что этого никогда не происходит, потому что бывают случаи, когда функция возвращается, None
чтобы обозначить допустимое условие. Но, по моему поспешному и кратко обдуманному мнению, это произошло бы гораздо чаще, если бы используемые вами языки не допускали значения, которое означает: эта переменная еще не инициализирована.
Это не идеальное рассуждение: на самом деле, теперь, когда нулевые значения стали обычным явлением, они просто образуют еще один элемент набора допустимых значений, которые может принимать переменная. Но на практике у программистов есть способ отличить переменную, находящуюся в разумном состоянии, которое может включать состояние выхода из цикла, и то, что она находится в неинициализированном состоянии.