对于C编程时的vs.

时间:2010-06-01 15:11:42

标签: c loops for-loop while-loop

C中有三个循环:forwhiledo-while。它们之间有什么区别?

例如,几乎所有while语句都可以被for语句替换,对吧?那么,使用while的优势是什么?

19 个答案:

答案 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 vs do ... 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循环,您的计数器变量总是在循环的下一次迭代之前递增,这为您的代码增加了一些均匀性。


为了完整起见,在这里讨论breakcontinue语句可能是有意义的,这些语句在进行循环处理时会派上用场。

中断会立即终止当前循环,不再执行迭代。

//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个循环,并且可以更快地编写迭代代码。

当编译器获取代码并编译它时,它会将其转换为一种更容易让计算机在较低级别(程序集)上理解和执行的形式。在此翻译期间,whilefor语法之间的细微差别将丢失,并且它们将完全相同。

答案 8 :(得分:3)

for建议使用此方案中的一个或多个索引进行固定迭代。

whiledo... while是每次必须检查的条件时使用的构造(除了一些类似索引的构造,见上文)。它们在第一次执行条件检查时有所不同。

您可以使用任一构造,但根据您的使用情况,它们各有优缺点。

答案 9 :(得分:3)

前段时间我注意到For循环通常会生成几个机器指令而不是while循环。但是,如果仔细观察反映我的观察结果的例子,差异就是两三个机器指令,几乎不值得考虑。

另请注意,WHILE循环的初始化程序可以通过将其烘焙到代码中来消除,例如: G:

static int intStartWith = 100;

静态修改器将初始值烘焙到代码中,保存(鼓滚动)一个 MOV指令。更重要的是,将变量标记为静态会将其移动到堆栈帧之外。变量对齐允许,它也可能产生略小的代码,因为MOV指令及其操作数占用的空间比例如整数,布尔值或字符值(ANSI或Unicode)更多。

但是,如果变量在8字节边界上对齐,则常见的默认设置,烘焙到代码中的int,bool或TCHAR的成本与MOV指令的字节数相同。

答案 10 :(得分:2)

do while的一个特点就是你需要一段时间才能完成分号。它通常在宏定义中用于仅限制一次语句,同时限制宏的影响。如果宏定义为块,则可能会发生一些解析错误。

One explanation among others

答案 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)

whilefor语句都可以用于编程循环。取决于程序员是否使用了while循环或for循环。有些人习惯使用while循环,有些则使用for循环。

使用您喜欢的任何循环。但是,do...while loop can be somewhat tricky in C programming