我看到许多书籍中使用的不同惯例,其中您可以使用以下任一循环结构创建无限循环:
while()
foo();
for(;;)
foo();
但是,实际上,我应该了解哪些差异?哪一个更好?
我看到许多书籍中使用的不同惯例,其中您可以使用以下任一循环结构创建无限循环:
while()
foo();
for(;;)
foo();
但是,实际上,我应该了解哪些差异?哪一个更好?
(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; }
不行。我在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
,即条件是否为真。 - casablancajmp
中的差异只是一个稍微不同的偏移量。 - tc.没有区别。
但是
while() foo();
不同于
for(;;foo();)
记住!如果在foo()语句之前中断while循环,foo()不会执行,但是如果在for循环中断,foo()会执行...
没有区别。
除了在 while 循环中,你必须放置一些真实的条件,例如 while(1)
。
另请参阅:“for(;;)”比“while(TRUE)”更快吗?如果不是,为什么人们使用它?
此外,“更好”的可能是那个不是无限的。 :)
它们都是相同的... 现代编译器为两者发出相同的代码... 有趣的是(历史上?) for(;;) 更受欢迎... Pascal程序员曾经使用 #define (;;), 并使用 forever {//code}。
while( true )
。它们在语义上是等价的,这只是一种风格/个人选择的问题。
for (x; y; z) { foo; }
等同于{ x; while (y) { foo; z; } }
。 - Jon Purdy