C中有三个循环:for
,while
和do-while
。它们之间有什么区别?
例如,几乎所有while
语句都可以被for
语句替换,对吧?那么,使用while
的优势是什么?
答案 0 :(得分:152)
while循环将始终首先评估条件。
while (condition) {
//gets executed after condition is checked
}
执行/ while循环将始终执行
首先是do{}
块中的代码
然后评估条件。
do {
//gets executed at least once
} while (condition);
for循环允许您启动计数器变量,检查条件以及在一行中递增计数器的方法。
for (int x = 0; x < 100; x++) {
//executed until x >= 100
}
在一天结束时,它们仍然是循环,但它们在执行方式方面提供了一些灵活性。
以下是对使用每种不同类型循环的推理的一个很好的解释,可能有助于清理事物。谢谢clyfe
for
之间的主要区别 而while
是一个问题 语用学:我们通常使用for
时 有一个已知的迭代次数, 当使用while
构造时 未知的迭代次数 预先。while
vsdo ... while
问题也是语用学的 第二次执行指令 在开始时,然后它表现出来 就像简单的一样。
For循环特别好,因为它们很简洁。为了这个for循环
for (int x = 0; x < 100; x++) {
//executed until x >= 100
}
要写为while循环,您必须执行以下操作。
int count = 0;
while (count < 100) {
//do stuff
count++;
}
在这种情况下,有更多的东西要跟上,count++;
可能会在逻辑中丢失。这可能最终会变得很麻烦,具体取决于count
增加的位置,以及它是否应该在循环逻辑之前或之后递增。使用for
循环,您的计数器变量总是在循环的下一次迭代之前递增,这为您的代码增加了一些均匀性。
为了完整起见,在这里讨论break
和continue
语句可能是有意义的,这些语句在进行循环处理时会派上用场。
中断会立即终止当前循环,不再执行迭代。
//will only run "do stuff" twice
for (int x = 0; x < 100; x++) {
if (x == 2) {
break;
}
//do stuff
}
继续将终止当前迭代,然后转到下一个。
//will run "do stuff" until x >= 100 except for when x = 2
for (int x = 0; x < 100; x++) {
if (x == 2) {
continue;
}
//do stuff
}
请注意,在for循环中,'continue'计算'for(part1; part2; part3)'的'part3'表达式;相反,在while循环中,它只是跳转以重新评估循环条件。
答案 1 :(得分:15)
如果对速度和性能存在强烈关注,最好的方法是验证编译器在汇编级别生成的代码。
例如,以下代码显示“do-while”更快一些。这是因为“do-while”循环不使用“jmp”指令。
BTW,在这个具体的例子中,最坏的情况是由“for”循环给出的。 :))int main(int argc, char* argv[])
{
int i;
char x[100];
// "FOR" LOOP:
for (i=0; i<100; i++ )
{
x[i] = 0;
}
// "WHILE" LOOP:
i = 0;
while (i<100 )
{
x[i++] = 0;
}
// "DO-WHILE" LOOP:
i = 0;
do
{
x[i++] = 0;
}
while (i<100);
return 0;
}
//“FOR”LOOP:
010013C8 mov dword ptr [ebp-0Ch],0
010013CF jmp wmain+3Ah (10013DAh)
for (i=0; i<100; i++ )
{
x[i] = 0;
010013D1 mov eax,dword ptr [ebp-0Ch] <<< UPDATE i
010013D4 add eax,1
010013D7 mov dword ptr [ebp-0Ch],eax
010013DA cmp dword ptr [ebp-0Ch],64h <<< TEST
010013DE jge wmain+4Ah (10013EAh) <<< COND JUMP
010013E0 mov eax,dword ptr [ebp-0Ch] <<< DO THE JOB..
010013E3 mov byte ptr [ebp+eax-78h],0
010013E8 jmp wmain+31h (10013D1h) <<< UNCOND JUMP
}
//“WHILE”LOOP:
i = 0;
010013EA mov dword ptr [ebp-0Ch],0
while (i<100 )
{
x[i++] = 0;
010013F1 cmp dword ptr [ebp-0Ch],64h <<< TEST
010013F5 jge wmain+6Ah (100140Ah) <<< COND JUMP
010013F7 mov eax,dword ptr [ebp-0Ch] <<< DO THE JOB..
010013FA mov byte ptr [ebp+eax-78h],0
010013FF mov ecx,dword ptr [ebp-0Ch] <<< UPDATE i
01001402 add ecx,1
01001405 mov dword ptr [ebp-0Ch],ecx
01001408 jmp wmain+51h (10013F1h) <<< UNCOND JUMP
}
//“DO-WHILE”循环:
i = 0;
. 0100140A mov dword ptr [ebp-0Ch],0
do
{
x[i++] = 0;
01001411 mov eax,dword ptr [ebp-0Ch] <<< DO THE JOB..
01001414 mov byte ptr [ebp+eax-78h],0
01001419 mov ecx,dword ptr [ebp-0Ch] <<< UPDATE i
0100141C add ecx,1
0100141F mov dword ptr [ebp-0Ch],ecx
01001422 cmp dword ptr [ebp-0Ch],64h <<< TEST
01001426 jl wmain+71h (1001411h) <<< COND JUMP
}
while (i<100);
答案 2 :(得分:10)
他们都是可以互换的;你可以选择一种类型并且永远使用它,但通常一种方法对于给定的任务更方便。这就像是说“为什么要切换,你可以只使用一堆if语句” - 是的,但是如果它是检查一组变量的常见模式,那么如果有一个语言特征,它会更方便,更容易阅读这样做
答案 3 :(得分:10)
为了便于阅读
答案 4 :(得分:8)
如果您希望在条件为真时执行循环,而不是在一定次数的迭代中执行循环,则其他人更容易理解:
while (cond_true)
比这样:
for (; cond_true ; )
答案 5 :(得分:5)
请记住,for
循环本质上是一个花哨的while
循环。 他们是一回事。
while <some condition is true> {
// do some stuff
// possibly do something to change the condition
}
for ( some var, <some condition is true>; increment var ) {
}
for循环的优点是很难意外地进行无限循环。或者更确切地说,当你做一个时更明显,因为你通常把loop var放在初始语句中。
当您没有执行标准递增模式时,while
循环会更清晰。例如:
int x = 1;
while( x != 10 ) {
if ( some condition )
x = 10;
else
x += 5;
}
答案 6 :(得分:4)
你应该使用这样一个循环,它完全符合你的需要。 例如:
for(int i = 0; i < 10; i++)
{
print(i);
}
//or
int i = 0;
while(i < 10)
{
print(i);
i++;
}
显然,在这种情况下,“for”看起来比“while”更好。 当必须在检查循环条件的那一刻之前完成某些操作时,应该使用“do while”。
抱歉我的英语不好。)
答案 7 :(得分:4)
我见过while
/ for
循环的一个常见误解是它们的效率不同。 While
循环和for
循环效率相同。我记得来自highschool的计算机老师告诉我,当你必须增加一个数字时,for循环对迭代更有效。事实并非如此。
For
循环只是syntactically sugared while
个循环,并且可以更快地编写迭代代码。
当编译器获取代码并编译它时,它会将其转换为一种更容易让计算机在较低级别(程序集)上理解和执行的形式。在此翻译期间,while
和for
语法之间的细微差别将丢失,并且它们将完全相同。
答案 8 :(得分:3)
for
建议使用此方案中的一个或多个索引进行固定迭代。
while
和do... while
是每次必须检查的条件时使用的构造(除了一些类似索引的构造,见上文)。它们在第一次执行条件检查时有所不同。
您可以使用任一构造,但根据您的使用情况,它们各有优缺点。
答案 9 :(得分:3)
前段时间我注意到For循环通常会生成几个机器指令而不是while循环。但是,如果仔细观察反映我的观察结果的例子,差异就是两三个机器指令,几乎不值得考虑。
另请注意,WHILE循环的初始化程序可以通过将其烘焙到代码中来消除,例如: G:
static int intStartWith = 100;
静态修改器将初始值烘焙到代码中,保存(鼓滚动)一个 MOV指令。更重要的是,将变量标记为静态会将其移动到堆栈帧之外。变量对齐允许,它也可能产生略小的代码,因为MOV指令及其操作数占用的空间比例如整数,布尔值或字符值(ANSI或Unicode)更多。
但是,如果变量在8字节边界上对齐,则常见的默认设置,烘焙到代码中的int,bool或TCHAR的成本与MOV指令的字节数相同。
答案 10 :(得分:2)
do while
的一个特点就是你需要一段时间才能完成分号。它通常在宏定义中用于仅限制一次语句,同时限制宏的影响。如果宏定义为块,则可能会发生一些解析错误。
答案 11 :(得分:2)
除do-while
循环外,它们几乎相同。当你有for
种变量时,counter
循环很好。这很明显。 while
循环在检查标志的情况下是有意义的,如下所示:
while (!done) {
if (some condtion)
done = true;
}
答案 12 :(得分:2)
WHILE更灵活。在适用的情况下,FOR更简洁。
FOR非常适合具有某种计数器的循环,例如
for (int n=0; n<max; ++n)
当然,正如其他人所指出的那样,你可以用WHILE完成同样的事情,但现在初始化,测试和增量在三行中被打破。如果环的主体很大,可能是三条分开的线。这使得读者更难看到你在做什么。毕竟,虽然“++ n”是FOR的一个非常常见的第三部分,但它肯定不是唯一的可能性。我写了很多循环,我写了“n + = increment”或更复杂的表达式。
当然,FOR也可以很好地使用计数器以外的东西。像
for (int n=getFirstElementFromList(); listHasMoreElements(); n=getNextElementFromList())
等
但是,当“下一次循环”逻辑变得更加复杂时,FOR会崩溃。考虑:
initializeList();
while (listHasMoreElements())
{
n=getCurrentElement();
int status=processElement(n);
if (status>0)
{
skipElements(status);
advanceElementPointer();
}
else
{
n=-status;
findElement(n);
}
}
也就是说,如果根据处理过程中遇到的条件,推进过程可能会有所不同,那么FOR语句是不切实际的。是的,有时您可以使用复杂的表达式,使用三元?:运算符等,但这通常会使代码的可读性降低而不是更易读。
实际上,我的大多数循环都是通过某种数组或类型的结构,在这种情况下我使用FOR循环;或正在从数据库中读取文件或结果集,在这种情况下,我使用WHILE循环(“while(!eof())”或类似的东西。)
答案 13 :(得分:2)
在for和while之间: while
不需要初始化也不需要更新语句,因此它可能看起来更好,更优雅; for
可能缺少一个语句,一个或两个,所以如果你需要初始化,循环条件和循环前的“更新”,它是最灵活和最明显的。如果您只需要循环条件(在循环开始时测试),则while
更优雅。
在for / while和do-while之间:在do-while
中,在循环结束时评估条件。如果循环必须至少执行一次,则更加舒适。
答案 14 :(得分:2)
for循环(至少考虑C99)优于while循环,因为它们限制了递增变量的范围。
当条件依赖于某些输入时,while循环是否有用。它们是三种循环类型中最常用的。
答案 15 :(得分:2)
while和do-while之间的区别在于,在检查循环条件时,如果这是真的,则执行正文并再次检查条件。 do-while在执行主体后检查条件,因此do-while主体至少执行一次。
当然你可以写一个while循环作为do-while和vv,但这通常需要一些代码重复。
答案 16 :(得分:2)
他们所做的工作都是一样的。您可以使用其中任何一个来执行相同的操作。但是为了可读性,可用性,便利性等,它们各不相同。
答案 17 :(得分:0)
/ * while循环
5块钱
1巧克力= 1美元
while my money is greater than 1 bucks
select chocolate
pay 1 bucks to the shopkeeper
money = money - 1
end
来到家里,不能去购物,因为我的钱= 0美元 * /
#include<stdio.h>
int main(){
int money = 5;
while( money >= 1){
printf("inside the shopk and selecting chocolate\n");
printf("after selecting chocolate paying 1 bucks\n");
money = money - 1 ;
printf("my remaining moeny = %d\n", money);
printf("\n\n");
}
printf("dont have money cant go inside the shop, money = %d", money);
return 0;
}
无限金钱
while( codition ){ // condition will always true ....infinite loop
statement(s)
}
请访问此视频以便更好地理解 https://www.youtube.com/watch?v=eqDv2wxDMJ8&t=25s
/ * for loop
5块钱
for my money is greater than equal to 1 bucks 0 money >= 1
select chocolate
pay 1 bucks to the shopkeeper
money = money - 1 1-1 => 0
end
* /
#include<stdio.h>
int main(){
int money = 5;
for( ; money >= 1; ){ 0>=1 false
printf("select chocolate \n");
printf("paying 1 bucks to the shopkeeper\n");
money = money - 1; 1-1 = 0
printf(" remaining money =%d\n", money);
printf("\n\n");
}
return 0;
}
为了更好地理解,请访问https://www.youtube.com/watch?v=_vdvyzzp-R4&t=25s
答案 18 :(得分:-1)
while
和for
语句都可以用于编程循环。取决于程序员是否使用了while
循环或for
循环。有些人习惯使用while
循环,有些则使用for
循环。
使用您喜欢的任何循环。但是,do...while
loop can be somewhat tricky in C programming。