我看到很多书所用的不同的约定我读了,在那里你会创建一个无限循环或者循环结构,如:无限循环和循环之间有什么区别?
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; }
不是。
第一个不会编译。您至少需要:while(true)
。它们在语义上是等效的。这是一个风格/个人选择的问题。
没有区别。
除了在while循环中,你必须在那里放置一些真实的条件, while(1)
。
参见:Is "for(;;)" faster than "while (TRUE)"? If not, why do people use it?
而且,在一个“更好”的一个可能是不是无限的。 :)
很好的发现与其他问题。 – Nullw0rm 2010-08-21 01:30:53
这里是我在调试模式下用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**
}
启用任何优化后,此差异绝对不存在。 – 2010-08-21 01:46:19
区别仅在于调试模式默认关闭了优化。前3行实际上是检查'1!= 0',即条件是否成立。 – casablanca 2010-08-21 01:48:30
而'jmp'的区别只是一个稍微不同的偏移量。 – 2010-08-21 01:57:15
没有区别。
但是
而()FOO();
是不一样的那
为(;; FOO();)
切记!如果你把foo()语句之前突破的同时,FOO()不执行,但如果你打破了,FOO()执行...
他们都是相同的。现代编译器发出相同两个..有趣的(历史?)的为(;;)更受欢迎..帕斯卡程序员做了的#define(;;)曾经和永久使用代码{//代码}
仅供参考,问题是询问无限循环,而不是针对vs的语义,而一般而言。 – 2010-08-21 01:17:47
如果你想避开声明'x'的地方,你可以说'for(x; y; z){foo; }'相当于'{x; while(y){foo; Z者除外; }}。 – 2010-08-21 01:29:18
至于语义,for-loops的C语言标准允许构造一个与while循环相同的for循环。 然而,这与for循环的深层语义理解相冲突,它总是包含循环变体(为了方便的原因,通常将其定义为相同的正数)。 对于一致的语义,应该在执行循环(for-loops)之前明确迭代次数已知的循环之间的清楚分离,以及在执行之前迭代次数未知的循环(while循环)。 – Schedler 2010-08-21 03:14:41