第一种是惯用的方式;这是大多数 C 程序员希望看到的。但是,我应该指出,大多数人也希望看到
for(i = 0; i < a; i++)
请注意,循环从零开始。这将做一些a 次。如果你要编写一个while 循环,它相当于上面的for 循环,我强烈建议你将它写成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(;;) 的正确方法。
希望对您有所帮助。