如果你想要的只是一个简单的计数循环,那么
for (i=0; i<100; i++) dostuff();
会好的,编译器可以优化它。
如果您在 for 语句的 continue 部分使用函数,例如
for (i=0; i<strlen(s); i++) dostuff();
然后每次都会评估该函数,这通常不是一个好主意,因为函数开销会减慢您的进程。有时它会减慢你的进程到无法使用的程度。
如果函数的返回值在迭代过程中不会改变,则将其从循环中提取出来:
slen = strlen(s);
for (i=0; i<slen; i++) dostuff();
但是有时函数会在每次调用时返回不同的值,然后你不希望它从循环中提取:
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 被称为每个循环。
我编写了较低级别的函数,因此它们可以在这样的 for 循环中使用。它将 while 循环的所有元素组合在一起,因此您可以更轻松地理解它。