Це свого роду непряма відповідь, але це питання змусило мене задуматись над логікою, яка лежить в основі цього, і я подумав, що цим, можливо, варто поділитися.
Як сказали всі інші, ви використовуєте 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)
Отже, ось суть моєї думки: у мовах із типовими типами ситуація initial_value == exit_value
виникає набагато рідше, і саме тому ви не стикаєтесь із нею. Я не кажу, що це ніколи не трапляється, оскільки все ще бувають випадки, коли функція повертається, None
щоб означати дійсну умову. Але, на мій поспішний і коротко обміркований погляд, це сталося б набагато більше, якби в мовах, які ви використовували, не було значення, яке означає: ця змінна ще не ініціалізована.
Це не ідеальне міркування: насправді, тепер, коли нульові значення є загальними, вони просто утворюють ще один елемент набору допустимих значень, які може приймати змінна. Але практично, програмісти мають спосіб розрізнити змінну, яка перебуває в розумному стані, яке може включати стан виходу з циклу, і перебуває в неініціалізованому стані.