我经常看到游戏引擎在做
for(;;) if(!frame()) break;
为什么他们不写:
while(frame());
或者如果他们想用于:
for(;frame(););
有可能for(;;)或while(true)可以使编译器进一步优化,因为条件始终为true?!
答案 0 :(得分:4)
这是上课的马。
在这种情况下,任何优秀的优化编译器都会生成相同的代码。
老式的人严重依赖for(;;)
,因为大多数主流编译器在“正常”设置警告时都不会生成警告。在我看来,尽管有些人不喜欢空的循环体,并且至少第一种方法的循环体也不是空的,但至少while(frame());
更加清晰。
答案 1 :(得分:2)
上述语法[a for循环]产生与以下代码等效的代码:
{ init_statement while ( condition ) { statement iteration_expression ; } }
编译器不读取cppreference,但他们也知道每个for循环都可以编写为while循环,反之亦然。
您经常看到它的原因可能是惯例问题。我们只能猜测为什么选择了它。让我推测一下...
考虑此循环:
for (int i=0;i < N; ++i);
{
// do something
}
您能发现错误吗?好的编译器会对此发出警告,但是在我看来,发生此类错误或将无主体的循环与此类错误混淆的可能性足以避免无主体的循环,而这是免费的。
是否可能使用for(;;)或while(true)编译器可以 因为条件始终为真,所以进行更多优化?!
否,实际上,这三个版本中的条件都相同。