首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C程序设计中For 和while的区别是什么?

在C程序设计中For 和while的区别是什么?
EN

Stack Overflow用户
提问于 2018-05-02 06:28:11
回答 2查看 0关注 0票数 0

C中有三个循环:forwhile,和do-while。他们之间有什么区别?

EN

回答 2

Stack Overflow用户

发布于 2018-05-02 14:42:03

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

代码语言:javascript
复制
while (condition) {
  //gets executed after condition is checked
}

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

代码语言:javascript
复制
do {
  //gets executed at least once
} while (condition); 

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

代码语言:javascript
复制
for (int x = 0; x < 100; x++) {
   //executed until x >= 100
}

在一天结束时,它们仍然是循环的,但是它们在执行方式方面提供了一些灵活性。

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

代码语言:javascript
复制
for (int x = 0; x < 100; x++) {
   //executed until x >= 100
}

要写成一个while循环,你必须做下面的事情。

代码语言:javascript
复制
int count = 0;
while (count < 100) {
  //do stuff
  count++;
}

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

代码语言:javascript
复制
//will only run "do stuff" twice
for (int x = 0; x < 100; x++) {
  if (x == 2) {
    break;
  }
  //do stuff
}

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

代码语言:javascript
复制
//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循环中,它只是跳转来重新评估循环条件。

票数 0
EN

Stack Overflow用户

发布于 2018-05-02 15:36:13

如果对速度和性能有强烈的关注,最好的方法是在程序集级别验证编译器生成的代码。

例如,下面的代码显示“同时执行”的速度要快一些。这是因为“JMP”指令没有被“do-while”循环使用。

顺便说一句,在这个具体的例子中,最坏的情况是由“for”循环给出的。:)

代码语言:txt
复制
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”循环:

代码语言:txt
复制
    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
  }

//同时循环:

代码语言:txt
复制
  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
  }

//“同时执行”循环:

代码语言:txt
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100004002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档