Вот небольшая разница, которую я видел с разборкой VS2010 в режиме отладки. Не уверен, если этого достаточно, чтобы считать значащими и универсально true разница (по всему компилятору и со всеми оптимизациями).
Таким образом, концептуально эти петли такие же, но на уровне процессора, с бесконечными циклами сообщений, тактовые циклы для дополнительных/разных инструкций могут быть разными и иметь какое-то значение.
while(1)
004113DE mov eax,1 **// This is the difference**
004113E3 test eax,eax **// This is the difference**
004113E5 je main+2Eh (4113EEh)
f();
004113E7 call f (4110DCh)
004113EC jmp main+1Eh (4113DEh) **// This is the difference**
for(;;)
f();
004113EE call f (4110DCh)
004113F3 jmp main+2Eh (4113EEh) **// This is the difference**
}
FYI, вопрос задает вопрос о бесконечных циклах, а не о семантике for vs в целом. –
Если вы хотите обойти локализацию выражения 'x', вы можете сказать' for (x; y; z) {foo; } 'эквивалентно' {x; while (y) {foo; г; }} '. –
Что касается семантики, стандарт языка C для for-loops позволяет построить цикл for, который идентичен циклу while. Это, однако, противоречит более глубокому смысловому пониманию цикла for, который неизменно содержит вариант цикла (который часто определяется как тождественно положительный для удобства). Для согласованной семантики должно выполняться четкое разделение между циклами, где счетчик итераций известен до выполнения цикла (for-loops), и циклы, где счетчик итераций неизвестен до выполнения (while-loops). – Schedler