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循环,它们的分散会妨碍可读性。

但请注意,在某些情况下,看似等效的forwhile循环实际上并非如此。 例如:

 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在顶部)。

当然,这不是一个规则,程序员通常会按照他们认为合适的方式进行操作,但它确实使得通过代码轻松阅读而无需回溯理解某些部分。