循环结构概述为什么需要循环结构在编程中我们经常需要重复执行某些操作。例如计算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 循环执行结束