我在回顾Knuth的"计算机编程艺术"时阅读了以下内容:
"非常'实用性'意味着想成为CS的专业人员必须学习Kernighan在设计C时的错误,特别是一个臭名昭着的事实,即for循环反复评估for条件,这与大多数其他语言的行为重复并且无法匹配它实现了for循环."
(http://www.amazon.com/review/R9OVJAJQCP78N/ref=cm_cr_pr_viewpnt#R9OVJAJQCP78N)
这家伙在说什么?你怎么能实现一个for循环不仅仅是一个while循环的语法糖?
考虑一下:
for i:=0 to 100 do { ... }
在这种情况下,我们可以通过函数调用替换最终值100:
for i:=0 to final_value() do { ... }
......而且final_value
-function只会调用一次.
但是在C中:
for (int i=0; i...
final_value
通过循环每次迭代都会调用-function,因此更加冗长是一种很好的做法:int end = final_value(); for (int i=0; i
对于这个例子,我假设你实际上只想调用一次final_value.在C中表达这很麻烦.很可能你每次都想调用final_value,但我经常发现我只想调用一次.
2> codebunny..:如果你想要的只是一个简单的计数循环,那么
for (i=0; i<100; i++) dostuff();没问题,编译器可以优化它.
如果在for语句的continue部分使用函数,比如
for (i=0; i然后每次都会对函数进行评估,这通常不是一个好主意,因为函数开销会减慢你的进程.有时它会使您的过程变慢到无法使用的程度.
如果函数的返回值在迭代期间不会改变,则从循环中提取它:
slen = strlen(s); for (i=0; i但是有时候函数会在每次调用时返回不同的值,然后你不希望它从循环中提取出来:
for (isread(fd, &buffer, ISFIRST); isstat(fd) >= 0; isread(fd, &buffer, ISNEXT) { dostuff(buffer); }并且您希望每次都进行评估.(这是一个基于我所做工作的略有做法的例子,但它显示了潜力).
C为您提供了以任何方式滚动循环的原始能力.你必须知道你的循环应该如何工作,并根据你的需要尽可能地优化它.
最后一个例子可以表示为while循环:
isread(fd, &buffer, ISFIRST); while (isstat(fd) >= 0) { dostuff(buffer); isread(fd, &buffer, ISNEXT); }但它不是那么整洁,如果我在循环中使用continue,那么我必须再次调用迭代的isread.将整个事物放在for循环中使它更整洁,并确保迭代isread被称为每个循环.
我编写了较低级的函数,因此它们可以用于这样的循环.它将while循环的所有元素组合在一起,以便您可以更轻松地理解它.