Цикл do-while всегда можно переписать как цикл while.
Использовать ли только циклы while, while, do-while и for-loop (или любую их комбинацию) во многом зависит от вашего вкуса к эстетике и соглашений проекта, над которым вы работаете.
Лично я предпочитаю циклы while, потому что это упрощает рассуждения об инвариантах цикла IMHO.
Относительно того, существуют ли ситуации, когда вам нужны циклы do-while: вместо
do
{
loopBody();
} while (condition());
всегда можно
loopBody();
while(condition())
{
loopBody();
}
так что нет, вам никогда не нужно использовать do-while, если вы не можете по какой-либо причине. (Конечно, этот пример нарушает DRY, но это всего лишь подтверждение концепции. По моему опыту, обычно есть способ преобразовать цикл do-while в цикл while и не нарушать DRY в любом конкретном случае использования.)
«Когда в Риме, делай, как римляне».
Кстати: цитата, которую вы ищете, может быть такая ([1], последний абзац раздела 6.3.3):
Исходя из моего опыта, оператор do является источником ошибок и путаницы. Причина в том, что его тело всегда выполняется один раз перед проверкой условия. Однако для правильного функционирования тела условие, подобное конечному, должно соблюдаться при первом запуске. Чаще, чем я ожидал, я обнаружил, что эти условия не соответствуют действительности. Это имело место, когда я писал программу с нуля, а затем проверял ее, а также после изменения кода. Кроме того, я предпочитаю условие «заранее, где я могу это увидеть». Поэтому я стараюсь избегать дел-заявлений.
(Примечание. Это мой перевод немецкого издания. Если вы владеете английским изданием, не стесняйтесь редактировать цитату в соответствии с его оригинальной формулировкой. К сожалению, Аддисон-Уэсли ненавидит Google.)
[1] B. Страуструп: Язык программирования C ++. 3-е издание. Addison-Wessley, Reading, 1997.