C语言学习第9篇---C语言三大结构之二循环结构剖析

举报
CodeAllen 发表于 2021/10/30 00:15:01 2021/10/30
【摘要】 知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》,有兴趣的朋友可以看我置顶文章获取   循环结构的基本工作方式: 通过条件表达式判断是否执行循环体 条件表达式遵循if语句表达式的原则   do ,while ,for 的区别 do:语句先执行后判断,循环体至少执行...

知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》,有兴趣的朋友可以看我置顶文章获取

 

循环结构的基本工作方式:

通过条件表达式判断是否执行循环体

条件表达式遵循if语句表达式的原则

 

do ,while ,for 的区别

do:语句先执行后判断,循环体至少执行一次

while:先判断后执行,循环体可能不执行

for:先判断后执行,相比while更简洁一些

 

for(;;)和while(true)的区别:

在编程中,我们常常需要用到无限循环,常用的两种方法是while (1) 和 for (;;)。这两种方法效果完全一样,但那一种更好呢?让我们看看它们编译后的代码:
    编译前              编译后 
    while (1);         mov eax,1  
                                              test eax,eax 
                                               je foo+23h
                                               jmp foo+18h


        编译前              编译后 
    for (;;);          jmp foo+23h   
    一目了然,for (;;)指令少,不占用寄存器,而且没有判断跳转,比while (1)好。 

 

do ... while语句的循环方式示意图

while的循环方式示意图

for的循环方式示意图

 

实验1:三种循环语句的对比


  
  1. #include <stdio.h>
  2. int f1(int n)
  3. {
  4. int ret = 0;
  5. if( n > 0 )
  6. {
  7. do
  8. {
  9. ret += n;
  10. n--;
  11. }
  12. while( n > 0 );
  13. }
  14. return ret;
  15. }
  16. int f2(int n)
  17. {
  18. int ret = 0;
  19. while( n > 0 )
  20. {
  21. ret += n;
  22. n--;
  23. }
  24. return ret;
  25. }
  26. int f3(int n)
  27. {
  28. int ret = 0;
  29. int i = 0;
  30. for(i=1; i<=n; i++)
  31. {
  32. ret += i;
  33. }
  34. return ret;
  35. }
  36. int main()
  37. {
  38. printf("%d\n", f1(100));
  39. printf("%d\n", f2(100));
  40. printf("%d\n", f3(100));
  41. return 0;
  42. }

 

break和continue的区别:

break表示终止循环的执行

continue便是终止本次循环,进入下次循环执行

这个也是为什么switch不用continue的原因

 

实验2:continue和break的区别


  
  1. #include <stdio.h>
  2. void f1(int n)
  3. {
  4. int i = 0;
  5. for(i=1; i<=n; i++)
  6. {
  7. if( (i % 2) == 0 )
  8. {
  9. break;
  10. }
  11. printf("%d ", i);
  12. }
  13. printf("\n");
  14. }
  15. void f2(int n)
  16. {
  17. int i = 0;
  18. for(i=1; i<=n; i++)
  19. {
  20. if( (i % 2) == 0 )
  21. {
  22. continue;
  23. }
  24. printf("%d ", i);
  25. }
  26. printf("\n");
  27. }
  28. int main()
  29. {
  30. f1(10);
  31. f2(10);
  32. return 0;
  33. }

 

实验3:do和break的妙用


  
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. int func(int n)
  4. {
  5. int i = 0;
  6. int ret = 0;
  7. int* p = (int*)malloc(sizeof(int) * n);
  8. do
  9. {
  10. if( NULL == p ) break;
  11. if( n < 5 ) break;
  12. if( n > 100) break;
  13. for(i=0; i<n; i++)
  14. {
  15. p[i] = i;
  16. printf("%d\n", p[i]);
  17. }
  18. ret = 1;
  19. }while( 0 );
  20. printf("free(p)\n");
  21. free(p);
  22. return ret;
  23. }
  24. int main()
  25. {
  26. if( func(10) )
  27. {
  28. printf("OK\n");
  29. }
  30. else
  31. {
  32. printf("ERROR\n");
  33. }
  34. return 0;
  35. }

 

 

小结:

for循环先判断再进入循环体

for循环适合循环测试固定的场合

while循环先进判断再进入循环体执行

while循环适合与循环次数不定的场合

do ... while  循环先执行循环体再进行条件判断

do ... while 循环至少执行一次循环体

 

 

文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。

原文链接:allen5g.blog.csdn.net/article/details/78848685

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。