【发布时间】:2011-04-01 22:31:40
【问题描述】:
我看到我读过的许多书中都使用了不同的约定,您可以在其中创建具有任一循环结构的无限循环,例如:
while()
foo();
for(;;)
foo();
但实际上,我应该知道哪些差异?哪个更好?
【问题讨论】:
标签: c++ loops for-loop while-loop
我看到我读过的许多书中都使用了不同的约定,您可以在其中创建具有任一循环结构的无限循环,例如:
while()
foo();
for(;;)
foo();
但实际上,我应该知道哪些差异?哪个更好?
【问题讨论】:
标签: c++ loops for-loop while-loop
它们在语义上是等价的。 (x;y;z) { foo; } 等价于 x; while (y) { foo; z; }。它们在标准的其他版本中并不完全等效,在 for (int x = 0; y; z) 的示例中,x 的范围是 for 块,并且在循环结束后超出范围,而对于 int x; while (y) x,它仍在范围内循环结束后。
另一个区别是for 将缺少的y 解释为TRUE,而while 必须提供一个表达式。 for (;;) { foo; } 很好,但 while() { foo; } 不是。
【讨论】:
x的局部性,你可能会说for (x; y; z) { foo; }等价于{ x; while (y) { foo; z; } }。
这是我在调试模式下看到的 VS2010 反汇编的一个小区别。不确定,是否足以算作显着和普遍正确的差异(在所有编译器和所有优化中)。
因此,从概念上讲,这些循环是相同的,但在处理器级别,由于有无限的消息循环,附加/不同指令的时钟周期可能不同,并产生一些差异。
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**
}
【讨论】:
1 != 0,即条件是否为真。
jmp的区别只是偏移量略有不同。
没有区别。
除了在 while 循环中,你必须在那里放置一些真实的条件,例如while(1).
另请参阅:Is "for(;;)" faster than "while (TRUE)"? If not, why do people use it?
此外,“更好”的可能不是无限的。 :)
【讨论】:
没有区别。
但是
while() foo();
不一样
for(;;foo();)
记住!如果在 foo() 语句之前中断 while,则 foo() 不会执行,但如果中断 for,则 foo() 会执行...
【讨论】:
第一个不会编译。你至少需要:while( true )。它们在语义上是等价的。这是风格/个人选择的问题。
【讨论】:
它们都是相同的.. 现代编译器为两者发出相同的代码.. 有趣的是(从历史上看?)for(;;) 更受欢迎.. pascal 程序员曾经做过 #define (;;),并使用永远{//代码}
【讨论】: