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循环,它们分散,妨碍了可读性.
请注意,但是,也有在表面上看似乎等价的情况for和while循环实际上不是.例如:
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(;;).
希望有所帮助.