我看到了我读过的很多书中使用的不同约定,你可以用这种循环结构创建无限循环,例如:
while()
foo();
for(;;)
foo();
但实际上,我应该知道的不同之处是什么?哪个更好?
答案 0 :(得分:7)
他们在语义上是等价的。 (x;y;z) { foo; }
相当于x; while (y) { foo; z; }
。它们在标准的其他版本中并不完全等效,在for (int x = 0; y; z)
的示例中,x
的范围是for block,并且在循环结束后超出范围,而{{1}在循环结束后它仍在范围内。
另一个区别是int x; while (y) x
将缺少的for
解释为TRUE,而y
必须提供一个表达式。 while
很好,但for (;;) { foo; }
不是。
答案 1 :(得分:2)
这是我在调试模式下看到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**
}
答案 2 :(得分:1)
没有区别。
除了在while循环中,你必须在那里放置一些真实条件,例如while(1)
。
另请参阅:Is "for(;;)" faster than "while (TRUE)"? If not, why do people use it?
此外,“更好”的可能是一个不是无限的。 :)
答案 3 :(得分:1)
没有区别。
但是
while()foo();
与
不一样有(;; FOO())
记住!如果你在foo()语句之前打破了一段时间,foo()就不会执行,但如果你打破了for,foo()会执行......
答案 4 :(得分:0)
第一个不会编译。您至少需要:while( true )
。它们在语义上是等价的。这是风格/个人选择的问题。
答案 5 :(得分:0)