尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
C语言Ⅳ:循环结构(while、for、do-while及嵌套循环)
循环结构概述为什么需要循环结构在编程中我们经常需要重复执行某些操作。例如计算1到100的累加和如果一条一条写加法语句需要写100条这显然不现实。循环结构正是为了解决这类“重复执行”的问题而设计的。什么是循环结构代码在满足某种条件的前提下重复执行就叫做循环结构。循环的分类按照有限和无限区分无限循环其实就是死循环。程序设计中需谨慎使用避免无退出条件的死循环。有限循环循环限定循环次数for或者终止循环的条件whiledo..while按照执行特点区分当型循环先判断后执行如果循环条件不满足循环体一次都不执行。whilefor直到型循环先执行后判断不管循环条件是否满足循环体至少执行一次。do..while循环体的构成循环条件如循环的次数或者循环的出口循环体需要重复执行的代码单语句可直接书写复合语句需要用{}包裹当型循环while语句while循环语法先判断后执行如果循环条件不满足循环体一次都不执行。语法[1] 循环变量; while ([2] 循环条件) // 注意循环条件就是循环判别用的条件表达式跟分支结构一样返回逻辑值 { [3] 循环语句; [4] 更新循环变量; } ​ // 注意如果循环语句是单语句可以省略{} while (循环条件) 循环单语句; while (循环条件) 循环单语句; ​ // 注意有些特殊情况下循环体语句糅合到了循环条件中此时可省略循环体 while(循环条件); // 举例while (getchar() ! \n); // 举例int i 1; while (i 5);说明循环条件的返回值必须是逻辑值使用非0表示真使用0表示假程序中基本上都是使用1表示真。C99版本引入了基本类型_Bool同时在stdbool.h头文件中定义了宏#define true 1、#define false 0可直接使用true/false表示真假需要提前引入#include stdbool.h{}包裹起来的内容整体称之为循环体。循环体内需控制循环条件的变化否则产生死循环。执行过程案例累加和计算需求求1~100的累加和例如123...100分析创建变量sum 0接收累加和默认为0因为0不会破坏加法特性0跟任何数相加等于任何数创建一个循环变量i 1默认为累加求和的第1个计算数利用循环每次增1i实现复用在循环中使用sum i等价于sum sum i完成累加和运算。同时我们要限定循环的条件也就是i的范围i 100或者i 101第1次循环sum sum i 0 1 1; // 0 1第2次循环sum sum i 1 2 3; // 1 2第3次循环sum sum i 3 3 6; // 0 1第4次循环sum sum i 6 4 10; // 0 1...代码/************************************************************************* File Name: demo01.c Author: *** Description: while循环案例求1~100的累加和累和算法 Created Time: 2026年08月05日 星期三 10时04分30秒 ************************************************************************/ ​ #include stdio.h ​ /** * 案例求1~100的累加和 */ int main(int argc,char *argv[]) { // 创建一个变量用来存储累加和初始值为0 int sum 0; // 创建一个循环变量i利用自增实现复用1,2,3...默认存储第一个运算数的值1 int i 1; ​ // 创建一个循环生成1~100的运算数 while (i 100) // 循环条件为真就执行循环体否则不执行 { // 累加和运算 sum i; // 等价于sum sum i ​ // 更新循环变量向出口逼近自增之后1,2,3...100i 等价于 i i 1 i; } ​ printf(1~100的累加和是%d\n, sum); ​ return 0; }运行结果an-vm:/mnt/hgfs/linuxc/20260805$ ./a.out 1~100的累加和是5050当型循环for语句for循环概述原则上for循环能实现的while循环也可以实现for循环可以看做是while循环的一种特殊写法for循环胜在结构清晰非常适合于知道循环次数的循环。for循环语法先执行后判断不管循环条件是否满足循环体至少执行一次。语法// 循环条件就是循环判别用的条件表达式返回逻辑值 for([1] 循环变量; [2] 循环条件; [4] 更新循环变量) { [3] 循环体语句 } ​ // 如果循环语句是单语句可以省略{} for([1] 循环变量; [2] 循环条件; [4] 更新循环变量) [3] 循环体语句; for([1] 循环变量; [2] 循环条件; [4] 更新循环变量) [3] 循环体语句;说明①()中可以仅保留两个;;举例for(;;)此时这种写法就是死循环的一种体现。②循环变量需要赋初始值循环变量可以是单个也可以是列表多个循环变量使用逗号分隔如// 循环变量是单个 for (int i 0; ..; ..) {..} ​ // 循环变量是多个 for (int i 0, j len -1; ..; ..) {..}③循环条件用来限制循环的次数循环条件也支持任意表达式常用的有关系和逻辑表达式如for (..; i 10 j 0; ..) {..}④更新循环变量支持列表列表使用逗号分隔这里可以使用赋值表达式如for (..; ..; i, j--) {..}执行过程循环实现的三要素循环变量的初始化举例int i 2循环条件举例i 100循环变量的更新举例i循环实现的三要素形成闭环初始化循环变量 → 判断循环条件 → 执行循环体 → 更新循环变量若更新缺失会导致死循环。for循环死循环的形式for (;;){..} for (表达式1;;){..} for (;;表达式3){..} for (表达式1;表达式2;){..} for (表达式1;;表达式3){..}直到型循环do_while语句特点先执行后判断不管条件是否满足循环体至少执行一次。do_while循环语法语法[1] 循环变量; do { [2] 循环体语句; [3] 更新循环变量; } while ([4] 循环条件);说明①循环条件的返回值必须是逻辑值0和非0实际上为了统一一般用1表示真②{}包裹起来的内容称之为循环体。③ 我们要在循环体中控制循环条件的变化否则会产生死循环。执行过程循环的嵌套嵌套规则3种循环while, for, do..while可以相互嵌套在前一个循环中又嵌套一个循环结构例循环结构的典型应用场景求累和求累积求均值举例(906985)/3的值求极值举例23,24,43中最大最小值元素遍历常用于数组元素的遍历基础算法模型累和定义一个变量sum并赋初值为0该变量累加每一个数据项i当访问完每一个数据项此时该变量的取值就是累加和的结果累积定义一个变量result并赋初值为1该变量累乘*每一个数据项i当访问完每一个数据项此时该变量的取值就是累乘和的结果极值定义一个变量并赋初值为第一个数据项从第二个数据项开始依次与该变量进行比较如果大于/小于该变量则将当前数据项的数据赋值给该变量当访问完每一个数据项此时该变量的取值就是求极值的结果...案例九九乘法表需求输出九九乘法表分析九九乘法表整体其实就是一个二维的面有长和宽构成编程中理解为行水平方向和列垂直方向每一行显示的列的数量不超过所在行假定行用i表示列用j表示在实现的时候我们需要两个嵌套的循环分别控制行和列内层循环控制列外层循环控制行/************************************************************************* File Name: demo01.c Author: *** Description: 九九乘法表 Created Time: 2026年08月06日 星期四 10时17分06秒 ************************************************************************/ ​ #include stdio.h ​ int main(int argc,char *argv[]) { // 外层循环控制行9行 for (int i 1; i 9; i) { // 内层循环控制列1~i列 for (int j 1; j i; j) { printf(%d*%d%d\t, j, i, j*i); } ​ printf(\n); } ​ printf(\n); ​ return 0; }运行结果an-vm:/mnt/hgfs/code/20260806$ gcc demo01.c an-vm:/mnt/hgfs/code/20260806$ ./a.out 1*11 1*22 2*24 1*33 2*36 3*39 1*44 2*48 3*412 4*416 1*55 2*510 3*515 4*520 5*525 1*66 2*612 3*618 4*624 5*630 6*636 1*77 2*714 3*721 4*728 5*735 6*742 7*749 1*88 2*816 3*824 4*832 5*840 6*848 7*856 8*864 1*99 2*918 3*927 4*936 5*945 6*954 7*963 8*972 9*981案例求素数需求求100~200之间的所有素数又称质数分析素数大于1的自然数且只能被1和自身整数符合这种规则的数就是素数1不是素数/************************************************************************* File Name: demo02.c Author: *** Description: 嵌套循环求素数 Created Time: 2026年08月06日 星期四 10时58分31秒 ************************************************************************/ ​ #include stdio.h ​ int main(int argc,char *argv[]) { // 创建一个变量存放100~200的自然数 int num 100; ​ // 定义一个循环变量 int i; ​ // 定义一个标志1-素数0-非素数 int flag; ​ // 外层循环 for (;num 200; num) { // 先假定每一个数都是素数 flag 1; ​ // 内层循环检测自然数num是否能被2~num/2之间的整数整除 for(i 2; i num/2; i) { // 校验 if (num % i 0) { flag 0; break; } } ​ if (flag) printf(%-4d,num); } ​ printf(\n); ​ return 0; }运行结果an-vm:/mnt/hgfs/code/20260806$ gcc demo02.c an-vm:/mnt/hgfs/code/20260806$ ./a.out 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199break与continuebreak语句功能① 用作switch中用来跳出switch中的case语句如果case没有break可能会产生case穿透② 用在循环中whilefordo..while提前结束循环也就是结束整个循环比如循环输出1,2,3,4,5在输出3的时候break此时4,5就不会再输出说明① break不能用于循环语句和switch之外的任何其他语句。② break只能终止并跳出最近的一层循环结构简而言之就是只能跳出单层循环。continue语句功能continue语句不会结束整个循环而是跳过本次循环尚未执行的语句进入下一次循环。说明① 仅用于循环语句中。② 在嵌套循环中continue语句只能对包含它最近一层循环起作用。简而言之只能用于单层循环。break与continue对比对比维度breakcontinue作用范围switch语句、循环语句仅循环语句功能结束整个循环跳出循环体跳过本次循环剩余语句进入下一次循环嵌套循环中只能跳出最近的一层循环只对最近的一层循环起作用跳出嵌套循环说明跳出多层循环是不能直接使用break或continue实现的因为它们只能跳出单层循环跳出多层循环需要我们自定义标志位进行跳出标志位也可以配合break使用代码/************************************************************************* File Name: demo06.c Author: *** Description: 跳出嵌套循环两种方式 Created Time: 2026年03月18日 星期三 14时38分50秒 ************************************************************************/ ​ #include stdio.h ​ /** * 方式1仅通过控制标志位跳出 */ void test1() { // 定义一个逻辑值类型的标志位 int is_flag 1; // 默认为真循环成立 ​ // 定义一个变量接收控制台的输入 char op; ​ // 嵌套循环的跳出顺序由内到外 while (is_flag) { printf(外层循环执行的内容...\n); ​ while (is_flag) { printf(内层循环执行的内容...\n); ​ printf(请选择是否结束(Y/N)\n); while (getchar() ! \n); // 清空输入缓冲区残留的换行符 int result scanf(%c, op); // 建议大家用 while(getchar() ! \n); ​ // 校验是否跳出 if (result (op Y || op y)) // 更改is_flag的状态 is_flag 0; ​ } } printf(循环执行结束\n); ​ } ​ /** * 方式2通过标志位 break实现跳出 */ void test2() { // 定义一个逻辑值类型的标志位 int is_flag 1; // 默认为真循环成立 ​ // 定义一个变量接收控制台的输入 char op; ​ // 嵌套循环的跳出顺序由内到外 while (is_flag) { printf(外层循环执行的内容...\n); ​ while (1) { printf(内层循环执行的内容...\n); ​ printf(请选择是否结束(Y/N)\n); while (getchar() ! \n); // 清空输入缓冲区残留的换行符 int result scanf(%c, op); // 建议大家用 while(getchar() ! \n); ​ // 校验是否跳出 if (result (op Y || op y)) { // 更改is_flag的状态 is_flag 0; // 跳出外层循环 break; // break跳出内层循环 } ​ } } printf(循环执行结束\n); ​ } ​ int main(int argc,char *argv[]) { test2(); ​ return 0; }运行结果外层循环执行的内容... 内层循环执行的内容... 请选择是否结束(Y/N) y 循环执行结束
RELATED

相关推荐

阿里P7并发专项面经:CountDownLatch、CyclicBarrier、Semaphore、ConcurrentHashMap

阿里P7并发专项面经:CountDownLatch、CyclicBarrier、Semaphore、ConcurrentHashMap

上篇设计模式聊完,这篇进入Java并发专项。第28篇P7高级讲过AQS基础和线程池参数,这篇往深处走——并发工具类原理、ConcurrentHashMap底层、线程池实战调优。 P7并发面试两个层次:背概念(CountDownLatch干什么用的)和讲原理(CountDownLatch内部基于AQS共享模式,state是…

📅 2026/8/23 5:40:47
WarcraftHelper:3分钟解决魔兽争霸3在Windows 10/11的兼容性问题

WarcraftHelper:3分钟解决魔兽争霸3在Windows 10/11的兼容性问题

WarcraftHelper:3分钟解决魔兽争霸3在Windows 10/11的兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在Window…

📅 2026/8/23 5:40:47
NVIDIA Profile Inspector完全配置指南:解锁显卡隐藏性能的终极工具

NVIDIA Profile Inspector完全配置指南:解锁显卡隐藏性能的终极工具

NVIDIA Profile Inspector完全配置指南:解锁显卡隐藏性能的终极工具 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 你是否曾经觉得NVIDIA控制面板提供的选项太少,无法充分发挥显…

📅 2026/8/23 5:40:49
MORE NEWS

更多资讯

📰

GPU服务器租用多人协作实战:Linux目录权限与文件隔离配置

多人共用GPU服务器租用实例时,最常见的故障往往不是显卡性能不足,而是“代码能看不能改”“训练输出属于root”“数据被误删”。尤其在深度学习项目中,数据集、模型权重和日志交叉存放,一次不当的chmod -R 777就可能留下安全隐患。…

📰

大模型时代前端小白/程序员如何转型?底牌与未来全解析

大模型技术(如Claude Code、Codex、GLM 5.2等)大幅提升代码生成效率,引发企业裁员恐慌(如阿里飞猪传闻)。文章指出,AI擅长模板化工作,但无法处理生产环境中的复杂问题(如竞态条件、缓…

📰

【电机滤波代码4】基于Huber权重的鲁棒扩展卡尔曼滤波(EKF)原理与MATLAB例程:PMSM电流离群点降权。订阅专栏后可查看完整代码

如需帮助,或有滤波相关的MATLAB代码定制需求,可从个人主页左侧联系我 订阅专栏后,可直接查看源代码,粘贴到MATLAB空脚本中即可直接运行、得到结果 文章目录 总体介绍 运行结果 MATLAB源代码 程序详解 算法原理 核心公式 实现流程 参数说明 输出说明 总体介绍 面向PMSM电流离…

📰

2026年十二大品牌激光开袋机全方位横向对比报告|全品牌实测优缺点、适配工厂、避坑详解

摘要:目前国内激光开袋机品牌繁多、机型杂乱,从一线大牌、专业细分品牌、网红新款到组装杂牌多达数十种。很多服装厂购机踩坑,根源就是品牌定位分不清、机型优势看不懂、适配场景对不上。本文一次性汇总12个主流开袋机品牌,结合车…

📰

Matplotlib入门教程(四):绘图标记详解——marker 参数与样式定制

一、什么是绘图标记?绘图过程中,如果我们想要给坐标自定义一些不一样的标记,就可以使用 plot() 方法的 marker 参数来定义。标记的作用:作用说明突出数据点让读者一眼看到数据位置区分多条曲线不同曲线用不同标记美化图表提升视觉…

📰

Redis 系列 · 第 08 篇——面试收官:高频题与全景总结

把整个系列沉淀成一张知识地图 目 录 一、导读 二、高频面试题(基础类) 三、高频面试题(架构类) 四、高频面试题(场景类) 五、答题框架示范 5.1 框架一:为什么 Redis 快 5.2 框架二&#xff1a…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬