WHILE более гибок. FOR более лаконичен в тех случаях, когда он применяется.
FOR отлично подходит для циклов, у которых есть счетчик, например
for (int n=0; n<max; ++n)
Конечно, вы можете выполнить то же самое с WHILE, как уже указывали другие, но теперь инициализация, тест и приращение разбиты на три строки. Возможно три широко разделенные линии, если тело цикла большое. Это затрудняет читателю видеть, что вы делаете. В конце концов, хотя "++ n" является очень распространенным третьим элементом FOR, это, конечно, не единственная возможность. Я написал много циклов, где я пишу «n + = increment» или более сложное выражение.
FOR может также хорошо работать с вещами, отличными от счетчика, конечно. Как
for (int n=getFirstElementFromList(); listHasMoreElements(); n=getNextElementFromList())
1011 * Etc. *
Но FOR ломается, когда логика «в следующий раз через цикл» усложняется. Рассмотрим:
initializeList();
while (listHasMoreElements())
{
n=getCurrentElement();
int status=processElement(n);
if (status>0)
{
skipElements(status);
advanceElementPointer();
}
else
{
n=-status;
findElement(n);
}
}
То есть, если процесс продвижения может отличаться в зависимости от условий, возникающих при обработке, оператор FOR нецелесообразен. Да, иногда вы можете заставить его работать с достаточно сложными выражениями, использовать троичный оператор?: И т. Д., Но это обычно делает код менее читабельным, а не более читабельным.
На практике большинство моих циклов либо проходят через массив, либо какую-то структуру, в этом случае я использую цикл FOR; или читаем файл или набор результатов из базы данных, и в этом случае я использую цикл WHILE («while (! eof ())» или что-то в этом роде).