文章目录

  • 一、单层for循环
  • 二、for循环与if选择的嵌套
  • 三、多层for循环的嵌套
  • 四、while循环
  • 五、总结

一、单层for循环

  • 引例:C语言实现求1到10的和(用for循环实现)
#include <stdio.h>int main()
{int i, sum = 0;for (i = 1; i <= 10; i++)sum = sum + i;printf("sum = %d\n", sum);return 0;
}

单层for循环执行的顺序:

第一次循环先执行语句①,执行完语句①执行语句②,如果语句②成立则执行语句④,执行完语句④执行语句③,执行完语句③标志着第一次循环结束;第二次循环先执行语句②,如果语句②成立则执行语句④,执行完语句④执行语句③,执行完语句③标志着第二次循环执行结束,随后循环中语句的执行顺序与第二次循环一致。如果在循环过程中语句②不成立,则整个循环就结束了。直到整个循环结束后才会执行语句⑤,因为,for语句与if语句所能控制的范围相同,只能控制其接下来的第一条语句,言下之意是,语句⑤并不在for循环的内部。需要注意的是,语句①仅在第一次循环中执行,在其它循环过程中不执行。换句话说,语句①只会在整个循环过程中执行一次。语句①的作用其实是给变量进行初始化,所以它仅参与了第一次循环。还有值得注意的是,初学时容易在for (①; ②; ③)后加分号,这个情况我已经在《C语言if语句中常见的问题》这篇文章中的空语句问题中详细叙述了其中的道理,并且在for语句中依然适用,有兴趣的话可以一看。

  • 练习
  • C语言实现求1到10中奇数的和
#include <stdio.h>int main()
{int i, sum = 0;for (i = 1; i <= 10; i = i +2)sum = sum + i;printf("sum = %d\n", sum);return 0;
}
  • C语言实现求1+1/2+1/3+…+1/99+1/100

初学时的错误代码:

#include <stdio.h>int main()
{   int i;float sum = 0; // 考虑到和是小数,所以定义sum为float类型for (i = 1; i <= 100; i++)sum = sum + 1/i;printf("sum = %f\n", sum); // float类型的变量用%f输出return 0;
}

错误原因:没有考虑到1/i的数据类型。在C语言中,整型除以整型得到的结果只有整数位。例如,16/3 = 5。上述程序中i是整型变量,所以1/i也是整型,故从i大于等于2时,1/i的值永远为0。

因此需要将1/i的值想办法变为浮点数才可以实现想要的功能。C语言规定,只要被除数与除数其中的一个为浮点数,则商为浮点数。故解决的办法有两种,第一种是将1/i写为1.0/i,第二种是将整型变量i强制类型转化为float类型,正确的代码如下:

#include <stdio.h>int main()
{   int i;float sum = 0;for (i = 1; i <= 100; i++)sum = sum + 1.0/i;// 或 sum = sum + 1/(float)(i);printf("sum = %f\n", sum);return 0;
}
  • 思考1:如果将上述代码中的sum = sum + 1/(float)(i);改为sum = sum + (float)(1/i);后能否正确输出sum的值?
  • 思考2:能否将i直接定义为浮点型变量?
    答案是不能,因为浮点型数据是以IEEE754标准来存储的,但IEEE754标准无法确保精确存储每一个浮点数,例如,6.234在存储过程中很可能存的不是6.234而是6.23399999,这是IEEE754标准的缺陷。所以即便在该程序中将i定义为浮点型变量后输出的结果是正确的,也不能确保在其他程序中依然正确,因为i不一定是准确的数字。需要注意的是,我们一般不会把循环中不断发生更新的变量定义为浮点型变量,因为浮点型数据存储过程属于非精确存储。

二、for循环与if选择的嵌套

  • 引例:C语言实现求1到100之间所有可以被3整除的数字之和
#include <stdio.h>int main()
{int i, sum = 0;for (i = 1; i <= 100; i++){if (i % 3 == 0)sum = sum + i;}printf("sum = %d\n", sum);return 0;
}
  • 思考:下面的程序输出结果是什么?
#include <stdio.h>int main()
{int i, sum = 0;for (i = 1; i <= 12; i++){if (i % 3 == 0)sum = sum + i;printf("sum = %d\n", sum);}return 0;
}
  • 练习(以下题目均要求使用for循环和if选择的嵌套来完成)
  • 编写C语言程序求1到100之间的奇数之和
#include <stdio.h>int main()
{int i;int sum = 0;for (i = 1; i <= 100; i++){if (i % 2 == 1)sum += i;}printf("奇数之和为%d\n", sum);return 0;
}
  • 编写C语言程序求1到100之间的奇数的个数
#include <stdio.h>int main()
{int i;int count = 0;for (i = 1; i <= 100; i++){if (i % 2 == 1)count++;}printf("个数为%d\n", count);return 0;
}
  • 编写C语言程序求1到100之间的奇数的平均值
#include <stdio.h>int main()
{int i;int count = 0;int sum = 0;float average; // 考虑到平均值可能带有小数位,所以将平均值定义为float类型for (i = 1; i <= 100; i++){if (i % 2 == 1){count++;sum += i;}}average = 1.0 * sum / count; //也可以运用强制类型转换写成average = (float)(sum)/count;printf("平均数为%f\n", average);return 0;
}
  • 编写C语言程序求1到100之间的奇数之和与1到100之间的偶数之和
#include <stdio.h>int main()
{int i;int sum1 = 0; // 奇数和int sum2 = 0; // 偶数和for (i = 1; i <= 100; i++){if (i % 2 == 1)sum1 += i;elsesum2 += i;}printf("奇数之和为%d,偶数之和为%d\n", sum1, sum2);return 0;
}

三、多层for循环的嵌套

多层for循环执行的顺序:

第一次循环先执行语句①,执行完语句①执行语句②,如果语句②成立则跳入内部循环执行语句④,执行完语句④执行语句⑤,如果语句⑤成立则执行语句⑦,执行完语句⑦执行语句⑥,执行完语句⑥执行语句⑤,如果如果语句⑤不成立,则标志着内部循环执行完毕,接下来跳出内部循环执行语句③,执行完语句③标志着第一次整个循环结束;第二次循环先执行语句②,如果语句②成立,则再次跳入内部循环执行语句④,以此类推;如果语句②不成立,整个循环就结束了。由于⑧不属于任何一个for循环内部的语句,所以要在整个循环执行完毕后才会执行语句⑧。

换个方式:

因为for语句与if语句所能控制的范围相同,只能控制其接下来的第一条语句,所以语句⑦属于内部for循环,而语句⑦与内部的for循环语句构成的语句整体是一个语句,也就是上图中的绿色方框部分,这个整体语句又是外层for循环内部的第一个语句,所以,外层for循环所控制的语句就是绿色方框部分,而外层for循环完整的结构就是上图中的橙色方框部分。所以按照for循环的大体执行顺序,首先会执行语句①,执行完语句①执行语句②,如果语句②成立则会执行绿色方框部分,绿色方框部分是单层for循环,所以执行过程按照单层for循环的执行循序执行,当内部的绿色方框部分执行完毕后,则会执行语句③,语句③执行完标志着整体一次循环结束,下一次循环又从判断语句②是否成立开始,如果成立,则执行绿色方框部分;如果不成立,则整个循环结束。整个循环结束后才会执行语句⑧,因为语句⑧并不属于这两层for循环中的任何一层。

  • 思考1:下面的for循环的执行顺序是什么样的?
  • 思考2:下面的for循环的执行顺序是什么样的?
  • 思考3:下面的for循环的执行顺序是什么样的?
  • 思考4:下面的程序输出结果是什么?
#include <stdio.h>int main()
{   int i, j;for (i = 0; i <3; i++)for (j = 2; j < 5; j++)printf("AAAA\n");printf("BBBB\n");return 0;
}
  • 思考5:下面的程序输出结果是什么?
#include <stdio.h>int main()
{   int i, j;for (i = 0; i <3; i++)printf("AAAA\n");for (j = 2; j < 5; j++)printf("BBBB\n");printf("CCCC\n");return 0;
}
  • 思考6:下面的程序输出结果是什么?
#include <stdio.h>int main()
{   int i, j;for (i = 0; i <3; i++){printf("AAAA\n");for (j = 2; j < 5; j++)printf("BBBB\n");printf("CCCC\n");}return 0;
}

四、while循环

  • 引例:C语言实现求1到10的和(用while循环实现)
#include <stdio.h>int main()
{int i, sum = 0;i = 1;while (i <= 10){sum += i;i++;}printf("sum = %d\n", sum);return 0;
}
  • 对比:C语言实现求1到10的和(用for循环实现)
#include <stdio.h>int main()
{int i, sum = 0;for (i = 1; i <= 10; i++)sum = sum + i;printf("sum = %d\n", sum);return 0;
}

while循环与for循环的相互转换:
从上述两个程序可知,while循环和for循环可以进行互相转换,言下之意是,所有能用for循环实现的功能,就可以用while循环实现,反之同理。但是,while循环和for循环在写法上有一定的差别。

五、总结

循环结构在学习编程中起到至关重要的作用,几乎每个有用的程序中都有循环结构的身影,循环结构是我们以后编程中的重中之重,掌握其执行顺序是理解程序的不二法门,这篇文章主要描述了循环结构的执行顺序,随后我也会更新对应的循环练习题。

C语言之for循环与while循环相关推荐

  1. ssis for循环容器_SSIS Foreach循环与For循环容器

    ssis for循环容器 In this article, first, we will briefly describe foreach loops and for loops. Then, we ...

  2. LabView学习笔记(六):while循环与for循环

    Labview学习笔记: LabView学习笔记(一):基础介绍 LabView学习笔记(二):滤波器实验 LabView学习笔记(三):基本控件 LabView学习笔记(四):动态数据类型 LabV ...

  3. Java while循环与dowhile循环

    Java while循环与dowhile循环 1.while循环 2.do...while循环 1.while循环 语法 while(表达式){ 循环体 } 循环三要素1.变量初始化 2.循环条件的判 ...

  4. Python中For循环与While 循环的使用

    Python中For循环与While 循环的使用 For循环在枚举中使用: Continue和Break在For循环中的使用: 举例: For 循环与While 循环区别: break语句在While ...

  5. 循环结构(while 循环、do…while循环与while循环的区别以及跳出语句)

    while循环:当条件满足的时候,执行循环体,当不满足的时候退出循环. 例如:输出0-6之间的数 var i = 0;while(i<=6){// console.log(i);document ...

  6. for循环与while循环

    for循环与while循环 一.for循环 1.for为关键字,表示循环控制 2.for有四要素:循环变量初始化.循环条件.循环操作.循环变量迭代 3.循环操作,这里可以有多条语句,也就是我们要循环执 ...

  7. php in循环与for循环,详谈js中标准for循环与foreach(for in)的区别

    js中遍历数组的有两种方式 var array=['a'] //标准的for循环 for(var i=1;i alert(array[i]) } //foreach循环 for(var i in ar ...

  8. java读文件while改for循环_JAVA学习第十二天:while循环与for循环

    While循环 顺序结构只能执行一次,而循环结构可以执行多次或无数次. While循环 格式 while(布尔表达式){ 当布尔表达式成立时所要执行的命令 } 注意 若布尔表达式一直成立,则循环一直进 ...

  9. C#语句——循环语句(for循环与for循环嵌套)

    循环:反复执行某段代码. 循环四要素:初始条件,循环条件,循环体,状态改变. for(初始条件;循环条件;状态改变) { 循环体 } break --中断循环,跳出整个循环 continue--停止本 ...

最新文章

  1. 使用 conda 和 Jupyter 创建你的自定义 R 包,转换笔记为幻灯片
  2. 学习运维工程师是正确的选择,发展与前景都是和好的
  3. android内部类broadcastreceiver,android 公开静态内部类BroadcastReceiver
  4. C++类的继承与多重继承的访问控制【protected,private继承方式】
  5. 计算机应用科学计算文献,计算机应用参考文献
  6. Android:Touch和Click的区别
  7. 逆水寒7.25服务器维护,逆水寒7月26日更新维护公告 更新内容汇总
  8. 祝贺自己的博客又一个关键字排名上去了
  9. 2017安装包打开没反应_虚拟机中红帽linux连不上网络以及自带浏览器无法打开等问题的解决办法...
  10. 3D旋转相册html+css代码分享
  11. 田野调查手记·浮山摩崖石刻(七)
  12. python默认数据转换_Python之数据转换
  13. CVTE 2022届实习生 Web后台开发笔试
  14. 【微信小程序控制硬件④】 深度剖析微信公众号配网 Airkiss 原理与过程,esp8266如何自定义回调参数给微信,实现绑定设备第一步!(附带源码)
  15. 1024,一封写给CSDN家园Python初学者的信 Python初级、中级、高级学习路线
  16. oracle 删除数据违反约束条件,ORA-02292: 违反完整约束条件 处理
  17. 经纬度坐标转换为屏幕坐标
  18. Linux攻关之基础模块四 命令初识
  19. Java并发23:Atomic系列-普通原子类型AtomicXxxx学习笔记
  20. 勇往直前的菜鸟修炼手册

热门文章

  1. C语言程序设计-餐厅点餐系统
  2. 十只老鼠在1000瓶药水中找一瓶有毒的
  3. 【大数据存储技术】思考题及参考答案
  4. ASO代理业务浅析(一)aso服务商
  5. C++ Boost库:简介和第一个示例程序
  6. Mosquitto常用命令
  7. Reactive 反应式编程
  8. sql join备忘
  9. Intellij Idea创建maven项目,App.java代码编辑区没有run选项
  10. 【 Git错误记录(一)】Permissions 0755 for ‘/home/wwww/.ssh/id_rsa_github‘ are too open.