对于C编程时的vs.

use*_*546 74 c loops for-loop while-loop

有三个环在C: ,for,whiledo-while.他们之间有什么区别?

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

Rob*_*ner 160

一个while循环总是首先评估条件.

while (condition) {
  //gets executed after condition is checked
}
Run Code Online (Sandbox Code Playgroud)

DO/while循环将总是在执行代码do{}块,然后再评估条件.

do {
  //gets executed at least once
} while (condition); 
Run Code Online (Sandbox Code Playgroud)

一个for循环允许你启动一个计数器变量,检查条件和方式来增加您的柜台都在一行.

for (int x = 0; x < 100; x++) {
   //executed until x >= 100
}
Run Code Online (Sandbox Code Playgroud)

在一天结束时,它们仍然是循环,但它们提供了一些灵活性,如何执行.

以下是使用每种不同类型循环的原因的一个很好的解释,可能有助于清理事物.谢谢clyfe

fors和whiles 之间的主要区别在于语用学:我们通常for在有已知的迭代次数while时使用,并且当迭代次数事先未知时使用构造.该whileVS do ... while 问题也是语用学,第二次在开始执行指令,之后它的行为就像简单的一段时间.


For循环特别好,因为它们简洁.为了这个for循环

for (int x = 0; x < 100; x++) {
   //executed until x >= 100
}
Run Code Online (Sandbox Code Playgroud)

要编写为while循环,您必须执行以下操作.

int count = 0;
while (count < 100) {
  //do stuff
  count++;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,有更多的东西要跟上,并且count++;可能会在逻辑中丢失.这可能最终会变得麻烦,具体取决于count增加的位置,以及它是否应该在循环逻辑之前或之后递增.使用for循环,您的计数器变量总是在循环的下一次迭代之前递增,这为您的代码增加了一些均匀性.


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

break将立即终止当前循环,不再执行迭代.

//will only run "do stuff" twice
for (int x = 0; x < 100; x++) {
  if (x == 2) {
    break;
  }
  //do stuff
}
Run Code Online (Sandbox Code Playgroud)

continue将终止当前迭代并继续下一个迭代.

//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
}
Run Code Online (Sandbox Code Playgroud)

请注意,在for循环中,'continue'计算'for(part1; part2; part3)'的'part3'表达式; 相反,在while循环中,它只是跳转以重新评估循环条件.

  • `for'和`while'之间的主要区别在于语用学问题:当有*已知的迭代次数*时,我们通常使用`for`,而当*迭代次数为*时,使用`while`构造提前知道*.`while` vs`do ... while`问题也是语用学,第二个在开始时执行指令*一次*然后它的行为就像简单的`while`一样. (10认同)
  • 你应该讨论'继续'的行为吗?在'for'循环与'while'循环中?否则,好的答案. (7认同)
  • +1的优秀答案.值得注意的是:for循环不需要计数器变量.在C风格的语言中,它们实际上是(<start statement>; <continuation>; <每次迭代后执行>).它恰好是最常见的用法是计数器变量:for(int x = 0 [start]; x <100 [continue?]; ++ x [post-iteration]) (3认同)
  • +1写得很好的答案,有时重新审视"基础知识"对每个人都有好处 (2认同)

小智 15

如果对速度和性能存在强烈关注,最好的方法是验证编译器在汇编级别生成的代码.

例如,以下代码显示"do-while"更快一些.这是因为"do-while"循环不使用"jmp"指令.

顺便说一句,在这个具体的例子中,最坏的情况是由"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;
}
Run Code Online (Sandbox Code Playgroud)

//"FOR"循环:

    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
  }
Run Code Online (Sandbox Code Playgroud)

//"WHILE"循环:

  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
  }
Run Code Online (Sandbox Code Playgroud)

//"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);
Run Code Online (Sandbox Code Playgroud)


hoa*_*ang 10

为了便于阅读

  • 事实上......所有的循环都只是花哨的GOTO分支. (10认同)
  • 就此而言,您也可以使用goto作为循环. (3认同)

Mic*_*zek 10

它们都是可以互换的; 你可以选择一种类型并且永远使用它,但通常一种方法对于给定的任务更方便.这就像是说"为什么要切换,你可以只使用一堆if语句" - 是的,但是如果它是检查一组变量的常见模式,那么如果有一个语言特征,它会更方便,更容易阅读要做到这一点

  • 并不是的.for和while都可以执行零次体验 - 一次做不到. (4认同)
  • @Neil`do {if(!cond)break;/*做东西*/}而(cond);`.丑陋和重复,但这是我的观点,为什么变化存在:) (4认同)
  • 循环的主体仍然进入 - 这不是while和for的情况. (3认同)
  • @Neil嗯,对于"循环体"的某些定义.它会导致相同的行为 - 如果`cond`为false,它不会运行`/*do stuff*/`part (2认同)

Jus*_*ier 8

如果您希望在条件为真时执行循环,而不是在一定次数的迭代中执行循环,则其他人更容易理解:

while (cond_true)
Run Code Online (Sandbox Code Playgroud)

比这样的东西:

for (; cond_true ; )
Run Code Online (Sandbox Code Playgroud)

  • 代码应该像散文一样阅读,前者更接近于自然语言。也许不是“更容易”,但很可能更快地识别和理解。 (2认同)

Arm*_*est 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 ) {

}
Run Code Online (Sandbox Code Playgroud)

for循环的优点是难以意外地进行无限循环.或者更确切地说,当你做一个时更明显,因为你通常把loop var放在初始语句中.

一个while循环更加清晰,当你没有做一个标准的递增模式.例如:

int x = 1;
while( x != 10 ) {
  if ( some condition )
     x = 10;
  else 
     x += 5;
}
Run Code Online (Sandbox Code Playgroud)

  • 然而,for()和将其写成while()之间有一个细微的区别:你改变了continue的行为.对于for()情况,continue在检查条件之前执行增量步骤,而在while()中,continue将直接跳回到条件. (6认同)