C中的循环 – ()或while() – 哪个最好?
for()或while() – 哪个最好?
for (i=1; i<a; i++) /* do something */
要么
i=1; while (i<a) { /* do something */ i++; }
第一种是惯用的方式; 这是大多数C编码员期望看到的。 但是,我应该注意到大多数人也希望看到
for(i = 0; i < a; i++)
请注意,循环从零开始。 这将做一些事情。 如果您要编写一个等同于上面的for
循环的while
循环,我强烈建议您将其作为for
循环编写。 再一次,这是C编码员期望看到的。 此外,作为for
循环,更容易阅读,因为所有内容(初始化,循环条件,每次迭代后要执行的表达式)都在一行上。 对于while
循环,它们的分散会妨碍可读性。
但请注意,在某些情况下,看似等效的for
和while
循环实际上并非如此。 例如:
for(i = 0; i < 10; i++) { if(i == 5) continue; printf("%d\n", i); }
和
i = 0; while(i < 10) { if(i == 5) continue; printf("%d\n", i); i++; }
乍一看似乎是等同的,但事实并非如此。 for
循环将在控制台上打印0--9
跳过5
,而while
循环将在控制台上打印0--4
然后进入无限循环。
现在,它处理您询问的简单案例。 那些你没有问过的更复杂的案例怎么样? 嗯,这实际上取决于但是一个好的经验法则是:如果你要重复一些固定的预定次数,一个for
循环通常是最好的。 否则,使用while
循环。 这不是一个严格的规则,但它是一个很好的经验法则。 例如,你可以写
unsigned int v; unsigned int c; for(c = 0; v; v >>= 1) c += v & 1;
但我认为大多数C程序员都会这样写
unsigned int v; unsigned int c; c = 0; while(v) { c += v & 1; v >>= 1; }
或者,作为另一个例子,如果你要读到文件结尾,那么你应该使用while
循环。 从而
FILE *fp; fp = fopen(path, "r"); while(fgets(buf, max, fp) != NULL) { /* something */ }
代替
FILE *fp; for(fp = fopen(path, "r"); fgets(buf, max, fp) != NULL; ) { /* something */ }
现在,进入宗教领域,这就是为什么我更喜欢while(1)
作为for(;;)
无限循环的正确方法。
希望有所帮助。
这取决于。 什么使阅读最容易应该是一个指导恕我直言。 如果你事先知道边界,你可能应该使用’for’。 因为它清楚地表示循环开始的一行,它结束以及如何从一个元素转到另一个元素。
为Dan McG投票 – 如果循环有固定计数等,请使用 – 它更具惯用性。 每个经典案例:
for (i = 0; i < THRESHOLD; ++i) { something; }
比。
while (foo->next) { foo = foo -> next; }
另外:如果你发现自己遗漏了自己的条件,请考虑一下如果你重新调整它会是什么样子。
在一天结束时:返回并阅读循环的每个版本。 哪一个在你的脑海中更突出,意图是“明确的”?
在这种情况下哪一个最有意义。
for
循环告诉你它很可能是一个固定的计数循环。 从1结束开始。
while
循环并不意味着任何这样的事情,只是它在i >= a
时结束(至少从刚读取while (i在顶部)。
当然,这不是一个规则,程序员通常会按照他们认为合适的方式进行操作,但它确实使得通过代码轻松阅读而无需回溯理解某些部分。