
循环结构概述什么是循环结构代码在满足某种特定条件的前提下重复执行就叫做循环结构。循环的分类按照有限和无限区分无限循环其实就是死循环。程序设计中需谨慎使用避免无退出条件的死循环但无限循环在嵌入式系统主循环、游戏事件循环、服务器监听循环等场景下是有使用的设计模式需提供可控的退出机制。有限循环循环限定循环次数for或者终止循环的条件whiledo..while按照执行特点区分当型循环先判断后执行如果循环条件不满足循环体一次都不执行代表有whilefor直到型循环先执行后判断不管循环条件是否满足循环体至少执行一次代表为do..while..循环的构成循环条件如循环的次数或者循环的出口循环体需要重复执行的代码单语句可直接书写 复合语句需要用 {} 包裹当型循环while语句当型循环的特点特点先判断后执行如果循环条件不满足循环体一次都不执行代表whileforwhile循环语法语法[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的偶数和代码/************************************************************************* File Name: demo02.c Author: sl Description: while循环案例1~100偶数和 Created Time: 2026年08月06日 星期四 19时08分01秒 ************************************************************************/ #include stdio.h /** * 方式1使用if校验偶数 */ void while_test1() { // 创建一个变量sum 0用来存储偶数和 int sum 0; //创建一个循环变量i 2村塾参与运算的自然数2~100 int i 2; //创建一个循环生成2~100的自然数 while(i 100) { // 检验生成的i是否是偶数 if(i % 2 0) sum i; //更新循环变量防止死循环 i; } printf(1~100的偶数和是%d\n,sum); } /** * 方式2通过步长直接跳过奇数 */ void while_test2() { // 创建一个变量sum 0用来存储偶数和 int sum 0; //创建一个循环变量i 2村塾参与运算的自然数2~100 int i 2; //创建一个循环生成2~100的自然数 while(i 100) { // 计算偶数和 sum i; //更新循环变量防止死循环 i 2; } printf(1~100的偶数和是%d\n,sum); } int main(int argc,char *argv[]) { while_test1(); while_test2(); return 0; }结果:/mnt/hgfs/Code/Stage1/20260805$ ./a.out 1~100的偶数和是2550 1~100的偶数和是2550案例水仙花数..需求通过键盘录入一个整数 判断这个整数是否是水仙花数..解答代码/************************************************************************* File Name: demo01.c Author: sl Description: 独身数、水仙花数、四叶玫瑰数、五角星数、六合数、北斗七星数、八仙数、九九重阳数、十全十美数 Created Time: 2026年08月05日 星期三 15时02分27秒 ************************************************************************/ #include stdio.h #include math.h int main(int argc,char *argv[]) { int num,n 1,sum 0; // num 要输入的数 n 输入的数的位数 int temp; // 临时变量存储num的值用于后续计算 printf(请输入一个数); scanf(%d,num); //先给temp赋值 temp num; // 计算n的位数 while(temp / 10) n; printf(%d是一个%d位数\n,num,n); //重新给temp赋值 temp num; // 计算这个数的各位的n次幂之和 while(temp) { int title temp % 10; temp / 10; sum pow(title,n); } if(sum num) { switch(n) { case 1: printf(%d是一个独身数!\n,num); break; case 3: printf(%d是一个水仙花数!\n,num); break; case 4: printf(%d是一个四叶玫瑰数!\n,num); break; case 5: printf(%d是一个五角星数!\n,num); break; case 6: printf(%d是一个六合数!\n,num); break; case 7: printf(%d是一个北斗七星数!\n,num); break; case 8: printf(%d是一个八仙数!\n,num); break; case 9: printf(%d是一个九九重阳数!\n,num); break; case 10: printf(%d是一个十全十美数!\n,num); break; default: printf(%d是一个普通数\n,num); } } else printf(%d是一个普通数\n,num); return 0; }结果:/mnt/hgfs/Code/Stage1/20260805$ gcc demo01.c -lm :/mnt/hgfs/Code/Stage1/20260805$ ./a.out 请输入一个数153 153是一个3位数 153是一个水仙花数! :/mnt/hgfs/Code/Stage1/20260805$ ./a.out 请输入一个数11223 11223是一个5位数 11223是一个普通数案例斐波那契数列需求求斐波那契数列的前20个分析斐波拉契数列指的是符合一定规则的数列 举例1,1,2,3,5,8,13..斐波拉契数列的特点 第3个数等于前两个数之和 最开始的第1,2个是固定的 都是1解答代码/************************************************************************* File Name: demo03.c Author: sl Description: 斐波那契数列前20位 Created Time: 2026年08月06日 星期四 19时47分13秒 ************************************************************************/ #include stdio.h int main(int argc,char *argv[]) { // 创建两个变量用来存储第12个数默认都是1 int f1 1,f2 1; // 定义循环变量每次产生两个数20个数需要10次循环 int i 1; while(i 10) { // 输出当前的两个数列 printf(%-12d%-12d\n,f1,f2); // 更新f1 f2 // 第一次11 f1 f2; // 等价于f1 f1 f2 11 2 ,所以第三个数f1为2 f2 f1; // 等价于f2 f2 f1 12 3 ,此时第四个数f2为3 // 更新循环变量 i; } return 0; }结果:/mnt/hgfs/Code/Stage1/20260805$ gcc demo03.c :/mnt/hgfs/Code/Stage1/20260805$ ./a.out 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765当型循环for语句for循环概述原则上 for循环能实现的 while循环也可以实现 for循环可以看做是while循环的一种特殊写法 for循环胜在结构清晰 非常适合于知道循环次数的循环。for循环语法语法// 注意循环条件就是循环判别用的条件表达式返回的是逻辑值 for ([1] 循环变量; [2] 循环条件; [4] 更新循环变量) { [3] 循环体语句 } // 循环执行顺序 [1][2][3][4] → [2][3][4] → [2][3][4] → ... → [2] // 注意 如果循环语句是单语句 可以省略{} 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) {..}案例计算累加和需求计算1~100以内的偶数和解答代码/************************************************************************* File Name: demo04.c Author: sl Description: for循环实现求1~100偶数和 Created Time: 2026年08月06日 星期四 20时37分38秒 ************************************************************************/ #include stdio.h int main(int argc,char *argv[]) { int sum 0; int i 2; for(;i100;) { if(i %2 0) sum i; i; } printf(1~100的偶数和为%d\n,sum); return 0; }结果:/mnt/hgfs/Code/Stage1/20260805$ ./a.out 1~100的偶数和为2550案例计算阶乘需求用户通过键盘输入一个整数n 求n的阶乘值。 例如 n 4 n的阶乘 123*4解答代码/************************************************************************* File Name: demo05.c Author: sl Description: 计算阶乘 Created Time: 2026年08月06日 星期四 20时52分58秒 ************************************************************************/ #include stdio.h int main(int argc,char *argv[]) { // 创建一个变量考虑到阶乘值较大选用 unsigned long unsigned long n; // 创建一个变量用来保存乘积 // size_t:是unsigned long的别名有些版本是unsigned long long的别名 size_t r 1; printf(请输入一个整数); scanf(%lu,n); // 阶乘运算 for(size_t i 1; i n; i) r * i; printf(1~%lu的阶乘结果为%lu\n,n,r); return 0; }结果:/mnt/hgfs/Code/Stage1/20260805$ ./a.out 请输入一个整数12 1~12的阶乘结果为479001600 :/mnt/hgfs/Code/Stage1/20260805$ ./a.out 请输入一个整数6 1~6的阶乘结果为720 :/mnt/hgfs/Code/Stage1/20260805$ ./a.out 请输入一个整数100 1~100的阶乘结果为0警示累乘计算 如果乘积超过变量存储的范围 会溢出 结果计算可能不准确。 如输入99时结果溢出为0。直到型循环do-while语句直到型循环的特点特点先执行后判断不管条件是否满足循环体至少执行一次。代表do..while..do..while..循环语法语法[1]循环变量 do { [2]循环体语句; [3]更新循环变量; } while([4]循环条件);说明循环条件的返回值必须是逻辑值0和非0实际上为了统一一般用1表示真{}包裹起来的内容称之为循环体。我们要在循环体中控制循环条件的变化否则会产生死循环。执行过程特点先执行后判断不管条件是否满足循环体语句至少执行一次。案例求累加和需求求1~100的偶数和分析创建一个变量sum 0 用来存储偶数和创建一个循环变量i 2 用来存储自然数i 100创建一个do..while循环 在循环体中 校验i % 2 0 如果满足 就实现偶数和的计算sum i计算完成 在do..while循环体的末行 更新循环变量i 避免造成死循环限制循环的出口i 100 也就是i 100循环结束循环结束打印出sum的值代码/************************************************************************* File Name: demo06.c Author: sl Description: Created Time: 2026年08月07日 星期五 08时50分39秒 ************************************************************************/ #include stdio.h int main(int argc,char *argv[]) { int sum 0; int i 2; do { if(i %2 0) sum i; i; } while(i 100); printf(1~100的偶数和为%d\n,sum); return 0; }运行结果:/mnt/hgfs/Code/Stage1/20260805$ ./a.out 1~100的偶数和为2550案例猜骰子需求实现一个简单的猜骰子小游戏。 游戏规则是程序随机生成一个1到6之间的数字 玩家通过输入猜测点数 程序会提示猜测是太大还是太小 直到玩家猜中为止。代码------------------ | 猜骰子游戏 | ------------------ 请输入你的猜测a 请输入数字 请输入你的猜测19 猜大了再猜一次 请输入你的猜测6 猜大了再猜一次 请输入你的猜测5 恭喜你猜对了 你一共猜了3次 游戏结束 yueqianyueqian-vm:/mnt/hgfs/Code/Stage1/20260805$ cat demo07.c /************************************************************************* File Name: demo07.c Author: sl Description: 猜骰子 Created Time: 2026年08月07日 星期五 08时59分21秒 ************************************************************************/ #include stdio.h #include time.h #include stdlib.h int main(int argc,char *argv[]) { // 设置随机数种子使生成的数比较随机 srand((unsigned)time(NULL)); // 随机数使用前固定设定 // 创建变量用来保存系统生成的随机数 int number; // 创建变量用来保存用户通过控制台输入的数字 int guess; // 创建变量用来保存猜测的次数 int count 0; // 设计头 printf(------------------\n); printf(| 猜骰子游戏 |\n); printf(------------------\n\n); // 掷骰子生成1~6之间的随机数 number rand() % 6 1; // 猜骰子猜不对就一直猜直到猜对为止 do { printf(请输入你的猜测); // 进行输入校验 int result scanf(%d,guess); if(result 1) { // 先清空缓冲区 while(getchar() ! \n); printf(请输入数字\n); continue; } // 记录猜测次数 count; // 校验 if(guess number) printf(猜大了再猜一次\n); else if(guess number) printf(猜小了再猜一次\n); else { printf(恭喜你猜对了\n); printf(你一共猜了%d次\n,count); } } while(guess ! number); printf(游戏结束\n); return 0; }运行结果:/mnt/hgfs/Code/Stage1/20260805$ ./a.out ------------------ | 猜骰子游戏 | ------------------ 请输入你的猜测a 请输入数字 请输入你的猜测19 猜大了再猜一次 请输入你的猜测6 猜大了再猜一次 请输入你的猜测5 恭喜你猜对了 你一共猜了3次 游戏结束goto语句仅了解语法goto 标签(label)标签标明目标代码的位置是一个不加的字符串。案例求偶数和需求求1~100以内的偶数和。代码/************************************************************************* File Name: demo02.c Author: sl Description: goto 求1~100偶数和 Created Time: 2026年08月07日 星期五 17时19分54秒 ************************************************************************/ #include stdio.h int main(int argc,char *argv[]) { int sum 0; // 创建一个变量存储偶数和 int i2; // 创建循环变量 // 定义goto标记名字自己起符合标识符命名规范即可 loop: // 过滤偶数 if(i % 2 0) sum i; //偶数和计算 i; // 更新循环变亮 // 循环条件 if(i 100) goto loop; // 标签loop必须通过goto触发否则不生效 printf(1~100的偶数和为%d\n,sum); return 0; }结果:/mnt/hgfs/Code/Stage1/20260806$ gcc demo02.c :/mnt/hgfs/Code/Stage1/20260806$ ./a.out 1~100的偶数和为2550注意事项可读性goto语句会破坏代码的结构和可读性使得代码难以理解和维护。因此应尽量避免使用。替代方案大多数情况下可以使用循环、条件语句、函数等结构来替代goto语句使代码更加清晰和易于管理。嵌套限制goto语句仅能在当前函数内部跳转跨函数跳转到其他函数的标签是非法的会导致编译错误。错误处理在某些情况下goto语句可以用于错误处理例如从嵌套的多层循环中跳出。但即使在这种情况下也应谨慎使用并考虑是否有更好的替代方案。注意虽然goto语句在C语言中是合法的并且有时可能看起来很方便但过度使用或不当使用会导致代码质量下降。 因此建议尽量避免使用goto语句而是采用更结构化和可维护的编程方法。循环的嵌套嵌套规则3种循环while,for,do..while..可以相互嵌套以双重嵌套为例基础算法模型累和定义一个变量sum并赋初始值为0该变量累加每一个数据项i当访问完每一个数据项此时该变量的取值就是累加和的结果累积定义一个变量result并赋初始值为1该变量累加*每一个数据项i当访问完每一个数据项此时该变量的取值就是累乘积的结果极值更多应用场景为数组定义一个变量并赋初始值为第一个数据项从第二个数据项开始依次与该变量进行比较如果大于/小于该变量则将当前数据项的数据复制给该变量当访问完每一个数据项此时该变量的取值就是求极值的结果...案例九九乘法表分析我们发现九九乘法表整体其实就是一个二维的面由长和宽构成编程中理解为行水平方向和列垂直方向同时发现 每一行显示的列的数量不超过所在行第1行1列第2行2列...第9行9列假定行用i表示列用j表示i和j的关系j i大家都从1开始在实现的时候我们需要两个嵌套的循环分别控制行和列一般外层循环控制行内层循环控制列我们习惯使用嵌套for循环双重for循环代码#include stdio.h int main(int argc,char *argv[]) { // 外层循环 控制行 1~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; }运行结果:/mnt/hgfs/Code/Stage1/20260805$ gcc hw04.c :/mnt/hgfs/Code/Stage1/20260805$ ./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×981break与continuebreak语句案例猜数字改造需求实现一个简单的猜数字小游戏。游戏规则是程序随机生成一个数字玩家通过输入猜测数字程序会提示猜测是太大还是太小直到玩家猜中为止。使用while(1)break替代while(guess ! number)。代码/************************************************************************* File Name: demo08.c Author: 孙磊 Description: 猜数字 Created Time: 2026年08月10日 星期一 16时13分20秒 ************************************************************************/ #include stdio.h #include stdlib.h #include time.h int main(int argc,char *argv[]) { // 设置随机数种子 srand((unsigned)time(NULL)); // 创建变量number记录系统生成的随机数guess用户猜测count猜测次数 int number,guess,count 0; // 生成1~10之间的随机数 number rand() % 10 1; // 设计头 printf(---------------------\n); printf(| 猜数字小游戏 v1.0 |\n); printf(---------------------\n\n); printf(我已经想了一个1~10之间的整数你猜是多少\n); // 猜数字直到猜对为止 do { printf(请输入你的猜测); // 对输入进行校验防止输入非数字 int result scanf(%d,guess); // 非法类型校验 if(result ! 1) { // 清空缓冲区 while(getchar() ! \n); // 重新输入 printf(请输入数字!\n); continue; } count; // 统计数字输入次数 // 校验 if(guess number) printf(猜大了再猜一次\n); else if(guess number) printf(猜小了再猜一次!\n); else { printf(恭喜你猜对了\n你一共猜了%d次。\n,count); break; // 结束循环 } } while(1); printf(游戏结束!\n); return 0; }运行结果yueqianyueqian-vm:/mnt/hgfs/Code/Stage1/20260805$ ./a.out --------------------- | 猜数字小游戏 v1.0 | --------------------- 我已经想了一个1~10之间的整数你猜是多少 请输入你的猜测5 猜小了再猜一次! 请输入你的猜测7 猜小了再猜一次! 请输入你的猜测8 恭喜你猜对了 你一共猜了3次。 游戏结束!continue语句功能continue语句不会结束整个循环 而是跳过本次循环尚未执行的语句 进入下一次循环。说明仅用于循环语句中。在嵌套循环中continue语句只能对包含它的最近一层循环起作用。 简而言之 只能作用于单层循环。图示案例偶数和计算需求求1~100的偶数和代码/************************************************************************* File Name: demo09.c Author: 孙磊 Description: continue求偶数和 Created Time: 2026年08月10日 星期一 16时39分39秒 ************************************************************************/ #include stdio.h int main(int argc,char *argv[]) { int sum 0; for(int i 2; i 100; i) { if(i % 2 1) continue; sum i; } printf(1~100的偶数和为%d\n,sum); return 0; }运行结果:/mnt/hgfs/Code/Stage1/20260805$ ./a.out 1~100的偶数和为2550break与continue对比对比维度breakcontinue作用范围switch语句、循环语句仅循环语句功能结束整个循环跳出循环体跳过本次循环剩余语句进入下一循环嵌套循环中只能跳出最近的一层循环只对最近的一层循环起作用