2010-08-21 949 views
5

我看到很多书所用的不同的约定我读了,在那里你会创建一个无限循环或者循环结构,如:无限循环和循环之间有什么区别?

while() 
    foo(); 
for(;;) 
    foo(); 

不过说真的,什么是我应该知道的区别是什么?哪一个更好?

回答

7

它们在语义上是等效的。 (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; }不是。

+1

仅供参考,问题是询问无限循环,而不是针对vs的语义,而一般而言。 – 2010-08-21 01:17:47

+3

如果你想避开声明'x'的地方,你可以说'for(x; y; z){foo; }'相当于'{x; while(y){foo; Z者除外; }}。 – 2010-08-21 01:29:18

+0

至于语义,for-loops的C语言标准允许构造一个与while循环相同的for循环。 然而,这与for循环的深层语义理解相冲突,它总是包含循环变体(为了方便的原因,通常将其定义为相同的正数)。 对于一致的语义,应该在执行循环(for-loops)之前明确迭代次数已知的循环之间的清楚分离,以及在执行之前迭代次数未知的循环(while循环)。 – Schedler 2010-08-21 03:14:41

0

第一个不会编译。您至少需要:while(true)。它们在语义上是等效的。这是一个风格/个人选择的问题。

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

启用任何优化后,此差异绝对不存在。 – 2010-08-21 01:46:19

+0

区别仅在于调试模式默认关闭了优化。前3行实际上是检查'1!= 0',即条件是否成立。 – casablanca 2010-08-21 01:48:30

+0

而'jmp'的区别只是一个稍微不同的偏移量。 – 2010-08-21 01:57:15

1

没有区别。

但是

而()FOO();

是不一样的那

为(;; FOO();)

切记!如果你把foo()语句之前突破的同时,FOO()不执行,但如果你打破了,FOO()执行...

0

他们都是相同的。现代编译器发出相同两个..有趣的(历史?)的为(;;)更受欢迎..帕斯卡程序员做了的#define(;;)曾经和永久使用代码{//代码}