为了账号安全,请及时绑定邮箱和手机立即绑定

在C编程中与之相对?

在C编程中与之相对?

C
婷婷同学_ 2019-11-08 10:57:46
有三个环在C: ,for,while和do-while。它们之间有什么区别?例如,似乎几乎所有while语句都可以被for语句替换,对吗?那么,使用的好处是什么while?
查看完整描述

3 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

它们都是可以互换的。您可以选择一种类型,而永远只使用一种类型,但是通常对于给定任务而言,一种类型更方便。就像说“为什么要切换,您只能使用一堆if语句”一样-的确如此,但是如果它是一种常见的模式来检查变量的一组值,那么它具有语言功能,并且很容易阅读要做到这一点


查看完整回答
1 反对 回复 2019-11-08
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

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


例如,以下代码显示“ 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;

}

//“ 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

  }

//“ 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

  }

//“ 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);


查看完整回答
反对 回复 2019-11-08
  • 3 回答
  • 0 关注
  • 437 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信