Я передам производительность (подсказка: нет разницы, проверьте сгенерированный IR или сборку для доказательства), однако есть два важных различия в синтаксисе и обслуживании .
Синтаксис
Область действия переменной i
отличается. В случае for
, i
доступен только в заголовках for
и body , тогда как в случае while
он доступен после цикла. Как правило, лучше иметь более узкие рамки, меньше переменных в полете означает меньше контекста, о котором нужно беспокоиться при кодировании.
Техническое обслуживание
Цикл for
обладает замечательным преимуществом, заключающимся в том, что все итерационные операции группируются близко друг к другу, поэтому их можно проверять за один раз и проверять.
Кроме того, при введении операторов continue
есть одно важное отличие:
for(int i = 0; i != 10; ++i) {
if (array[i] == nullptr) { continue; }
// act on it
}
int i = 0;
while (i != 10) {
if (array[i] == nullptr) { continue; }
// act on it
++i;
}
В случае while
введение continue
создало ошибку: бесконечный цикл, так как счетчик больше не реализован.
Impact
for
циклы более удобочитаемы и лучше подходят для регулярных шаблонов итераций. Еще лучше, в C ++ 11 утверждение диапазона для:
for (Item const& item : collection) {
}
, где итерация полностью заботится компилятором, так что вы не ошибетесь! (это делает алгоритм for_each
несколько спорным ... и мы можем пожелать, чтобы старшее для формы начало отступать)
По словам: while
циклы должны быть зарезервированы для нерегулярных итерационных шаблонов, таким образом, они будут привлекать особое внимание при проверке кода и от будущего сопровождающего путем выделения неправильности из случай.