Как уже упоминалось во всех ответах здесь, любой приличный компилятор скомпилирует оба цикла в один и тот же машинный код.
Ваш машинный код (принимая MIPS в качестве примера) будет представлять собой набор нормальных операторов сборки, за которыми следуетветвь (onequal / notequal) в обоих случаях, обеспечивающая согласованность вашей эффективности.
Однако вы можете обсудить проблему стиля кодирования здесь (не эффективность).
Для циклов:
- Используется, когда вы точно знаете, сколько раз будет выполняться цикл.Известен случай выхода.
- Знайте, на какую величину ваш цикл будет увеличиваться на каждую итерацию
* Возможное использование: когда коллекция элементов уже существует и вы хотитепросмотреть его и узнать, сколько раз появляется определенное свойство.
Во время цикла:
Вы не знаете, сколькораз цикл будет работать.Существует сценарий выхода, который устанавливается / достигается когда-то во время работы цикла (если вы хотите смоделировать цикл for, вы будете использовать что-то вроде счетчика (дополнительный код))
Не знаю, на сколько ваш цикл будет увеличиваться на.Ваш шаг / следующий шаг может быть установлен динамически.Хотя вы можете сделать это в цикле for, вам придется учитывать приращение на каждой итерации, а также вызывать некоторый нечитаемый код, которого можно избежать, если вы используете цикл while.
* Вероятное использование: поиск потока для некоторых данных.Вы не знаете, как долго будет длиться поток, поэтому ваш случай выхода - когда поток заканчивается.Так как это поток, и вы можете получать данные построчно, вы можете вообще пропустить белые линии, делая ваши приращения непоследовательными.