C中的循环 - ()或while() - 哪个最好?

aks*_*aks 6 c for-loop while-loop

for()或while() - 哪个最好?

for (i=1; i<a; i++)
  /* do something */
Run Code Online (Sandbox Code Playgroud)

要么

i=1;
while (i<a) {
/* do something */
i++;
}
Run Code Online (Sandbox Code Playgroud)

jas*_*son 17

首先是习惯的方式; 这是大多数C编码员期望看到的.但是,我应该注意到,大多数人也会期待看到

for(i = 0; i < a; i++)
Run Code Online (Sandbox Code Playgroud)

请注意,循环从零开始.这会做一些事情a.如果您要编写一个while等同于for上面循环的循环,我强烈建议您将其作为for循环编写.再一次,这是C编码员期望看到的.此外,作为for循环,它更容易阅读,因为所有内容(初始化,循环条件,每次迭代后要执行的表达式)都在一行上.对于while循环,它们分散,妨碍了可读性.

请注意,但是,也有在表面上看似乎等价的情况forwhile循环实际上不是.例如:

for(i = 0; i < 10; i++) {
    if(i == 5) continue;
    printf("%d\n", i);
}
Run Code Online (Sandbox Code Playgroud)

i = 0;
while(i < 10) {
    if(i == 5) continue;
    printf("%d\n", i);
    i++;
}
Run Code Online (Sandbox Code Playgroud)

乍一看似乎是等同的,但事实并非如此.该for循环将打印0--9跳过5在控制台上,而while环将打印0--4在控制台上,然后进入无限循环.

现在,它处理您询问的简单案例.那些你没有问过的更复杂的案例怎么样?嗯,这实际上取决于但是一个好的经验法则是:如果你要重复一些固定的预定次数,一个for循环通常是最好的.否则,请使用while循环.这不是一个严格的规则,但它是一个很好的经验法则.例如,你可以写

unsigned int v;
unsigned int c;
for(c = 0; v; v >>= 1) c += v & 1;
Run Code Online (Sandbox Code Playgroud)

但我认为大多数C程序员都会这样写

unsigned int v;
unsigned int c;
c = 0;
while(v) { c += v & 1; v >>= 1; }
Run Code Online (Sandbox Code Playgroud)

或者,作为另一个例子,如果你要读到文件结尾,那么你应该使用while循环.从而

FILE *fp;
fp = fopen(path, "r");
while(fgets(buf, max, fp) != NULL) { /* something */ }
Run Code Online (Sandbox Code Playgroud)

代替

FILE *fp;
for(fp = fopen(path, "r"); fgets(buf, max, fp) != NULL; ) { /* something */ }
Run Code Online (Sandbox Code Playgroud)

现在,进入宗教领域,这就是为什么我更喜欢while(1)作为无限循环的正确方法for(;;).

希望有所帮助.