C语言分支与循环:从if到for的完整入门指南
学C语言最绕不开的两个东西就是分支和循环。哪怕你只会写一行printf(Hello World)只要把分支和循环用熟了就能解决一大堆实际问题——九九乘法表、冒泡排序、字符串逆序甚至PTA上那些让人头大的编程题本质都是“判断重复”的组合。很多新手卡在指针、数组上其实根子往往是分支和循环没吃透。这篇文章我把这两块内容从头到尾捋一遍把我在实际写代码和带新手时踩过的坑、总结的经验都放进来不管你是完全零基础还是已经写了半年C语言的同学都能从中找到点有用的东西。分支就是让程序在岔路口做选择循环就是让程序重复做同一件事。两者加起来几乎是所有复杂程序的地基。比如写一个银行取款程序要先判断余额够不够这是分支要连续处理多个账户这是循环。今天我们就从最基础的概念开始一步步把这块地基打牢。1. 分支结构让程序拥有判断力1.1 if语句的几种形态与常踩的坑if语句有几种常见形态单分支、双分支、多分支。单分支就是if (条件) { ... }双分支是加上else多分支可以用else if串联。这里最容易被新手忽略的是“悬挂else”问题else到底跟哪个if配对C语言规定else总是与最近的、尚未配对的if结合。所以看这个代码if (a 0) if (b 0) printf(positive\n); else printf(non-positive\n);看起来像是else跟外层if配对实际上它跟内层if配对。这就是经典的悬挂else陷阱。要避免它最简单的方法是永远给if和else加大括号。我见过很多老代码因为不加大括号出bug排查起来特别费劲。你可能觉得两个if嵌套不太会踩这个坑但实际工程里分支一多缩进一乱这种问题很容易混过去。还有个大坑是if后面的分号。比如if (a 0); printf(positive\n);因为if条件后面直接跟了一个空语句整个if就结束了下面的printf无论条件是否成立都会执行。这种错误在考试题里经常出现实际代码里也偶尔遇到特别是从其他语言转过来的同学容易手滑。建议平时写if语句时先把大括号写完整再往里面填代码不要先写条件后补括号这样可以从物理上减少这类低级错误。判断相等时建议把常量写在左边比如if (3 x)。这样万一漏写了一个等号编译器会报错而不是把x赋值给3之后条件永远为真进而引发隐藏bug。这是很多老兵的习惯新手可能觉得别扭但真的非常管用。我在实际项目里见过一次因为if (x 3)导致的线上事故排查了很久才发现从此之后团队统一要求常量前置。1.2 switch-case什么时候用比if更合适当程序要根据某个整型变量的不同取值执行不同操作时用switch-case往往比一长串else if更清晰。比如菜单选择switch (cmd) { case 1: add(); break; case 2: delete(); break; default: printf(Unknown command\n); break; }这里有两个关键细节每个case分支末尾的break不能丢否则会发生“穿透”也就是执行完case 1后继续执行case 2。有时候我们故意利用穿透让多个case共享同一段代码case 1: case 2: printf(small\n); break;但故意穿透时要写注释说明不然同事看了想打人。我见过一段switch代码四个case都没写break结果执行一个操作后把后面所有操作都跑了一遍数据被重复处理最后被测试同学提了bug。另一个细节是switch的表达式必须是整型char、int、枚举等不能是浮点数或字符串。如果你要对浮点数做区间判断老老实实回归if。另外case后面的值必须是编译期常量不能是变量。从效率上讲当case数量比较多且取值比较密集时编译器可能生成跳转表比if-else链更快。但普通业务代码不必过分纠结这点可读性优先。我把switch的使用场景总结成一句话判断的是“一个变量的取值等于什么”而不是“范围、大小、组合条件”用switch合适复杂条件用if。1.3 分支嵌套的代码规范与可读性优化分支嵌套太深是代码难读的最大来源。我见过一段代码if里面套if再套if最多达到七八层看到最后根本分不清哪个括号对应哪个逻辑。后来我把这段代码重构发现大部分嵌套可以通过提前return消除。比如int process(int x) { if (x 0) return -1; if (x 100) return -2; return x * 2; }比起嵌套int process(int x) { if (x 0) { if (x 100) { return x * 2; } else { return -2; } } else { return -1; } }前者的缩进层次浅逻辑一目了然这就是“卫语句”的思路。改写时要注意如果后续还有代码需要在分支之后统一处理那不能简单提前return需要结合具体场景。比如后面还有收尾操作那最好中途不要return。另外条件表达式里的优先级也容易出错。比如if (a 1 0)的优先级高于实际变成a (1 0)结果永远不对。所以涉及位运算和比较运算混合时务必加括号。类似和||的短路特性也要清楚if (p ! NULL p-value 0)只有p不为空时才会读取p-value这既是特性也是依赖别把顺序掉过来。短路特性还能用来避免除以零if (b ! 0 a / b 1)如果b是0就不会执行除法安全。2. 循环结构让程序学会重复2.1 while与do-while先判断还是先执行while循环是“先判断条件再决定是否执行循环体”如果条件一开始不成立循环体一次都不执行。do-while是“先执行一次循环体再判断条件”所以循环体至少执行一次。这个差异在选择时很关键。举个例子读取用户输入直到输入负数int n; do { scanf(%d, n); printf(got %d\n, n); } while (n 0);如果用while就需要在循环前先读取一次并赋初值再循环判断逻辑容易重复。do-while天然适合“至少要做一次”的场景比如菜单程序总要先显示菜单再根据选择继续。while循环最常见的死循环是把条件写反。比如while (i n)循环体里i被漏写了i永远不变程序卡死。还有一种情况是条件表达式中使用浮点数比较比如while (x ! 0.0)浮点数由于精度问题很难精确等于0除非x是从整数赋值且运算保证精确否则建议用fabs(x) 1e-6。我在做数值计算时经常被这个坑折磨后来统一规定浮点循环条件一律用区间判断避免“差一点点”导致的死循环。2.2 for循环的三要素与执行顺序for循环大概是C语言里最常用的循环结构为for (初始化; 条件; 更新) { 循环体 }。很多人以为它的执行顺序是“初始化—条件—更新—循环体”其实正确的是初始化只执行一次→ 判断条件 → 执行循环体 → 执行更新 → 再判断条件 → 再执行循环体 → 再更新……直到条件不满足。也就是说更新是在循环体之后执行的。这个顺序在写continue时特别容易让人困惑。continue会跳过循环体内后续语句直接跳到更新处执行。如果循环体里有i写在continue后面那它就永远不会执行导致死循环。例如for (i 0; i 10; i) { if (i 5) continue; printf(%d\n, i); }这里continue之后仍然执行i因为更新语句在for结构里不受continue影响。但如果写成while风格i 0; while (i 10) { if (i 5) continue; printf(%d\n, i); i; }continue就直接跳过了i死循环。这个区别很重要也是面试常考的点。我建议如果循环逻辑比较复杂优先使用for循环把更新放在头部这样continue的安全性更高。2.3 循环嵌套以九九乘法表为例九九乘法表是循环嵌套的经典题目适合理解内外层循环的关系。先看代码for (int i 1; i 9; i) { for (int j 1; j i; j) { printf(%d*%d%-2d , j, i, i * j); } printf(\n); }外层循环控制行号i内层循环控制每行输出多少个式子条件是j i所以第一行1个第二行2个直到第九行9个。%-2d是为了让数字左对齐占两格输出更整齐。很多人写这个题目时会把内层循环写成j 9结果打印出一个矩形而不是三角形但也不是错只是不符合要求。这里最核心的思维方式是明确外层变量和内层变量的角色。外层变量通常代表行、大范围内层变量代表列、小范围。内层循环的边界往往依赖外层变量的值这样才能构造出不同形状的输出。循环嵌套的复杂度是乘法级的两层循环O(n²)三层O(n³)。虽然九九乘法表是固定9次但理解这种复杂度关系对以后分析算法很有帮助。我在教学生时总会让他们先用手在纸上推演一遍i和j的取值再写代码这样不容易晕。纸上推演还有个好处能直观看到内层循环边界与外层变量的耦合关系比干想强太多。3. 控制流的刹车与加速break、continue、goto3.1 break到底跳出几层循环break只能跳出“最内层”的循环或switch不能跳多层。这个规则很多人一开始没意识到写双层循环时想在满足某个条件后全部退出结果只跳出了内层外层还在跑导致结果不对。正确的做法是增加一个标志变量int found 0; for (i 0; i n !found; i) { for (j 0; j m; j) { if (arr[i][j] target) { found 1; break; } } }把!found写进外层循环条件内层break跳出后外层条件自然不满足退出。也可以在break之后用goto直接跳到外层标记但goto大多数人不太敢用后面会说。还有一种方法是从内层直接修改外层循环变量比如把外层循环变量设为临界值让外层循环条件不满足。但这种做法不太优雅容易让阅读者困惑。相比之下标志变量是结构化编程里最稳妥的思路。3.2 continue的过滤作用continue用于跳过本次循环体剩余语句进入下一次循环。它特别适合处理“过滤”逻辑。比如统计一段文本中数字字符的个数可以在循环里先判断不是数字就continue是数字则计数。用continue可以把“例外情况”放在前面处理后面主逻辑就干净很多。int count_digits(const char *s) { int count 0; for (int i 0; s[i] ! \0; i) { if (s[i] 0 || s[i] 9) continue; count; } return count; }这里continue的价值在于把“非数字”的干扰项直接跳过后面的count无需再判断逻辑更清晰。如果没有continue就得用else包起来嵌套多一层。要注意的是continue在while和for中的差异前面已经说过在while中要确保循环变量的更新在continue之前执行否则死循环。我建议如果循环逻辑比较复杂优先使用for循环把更新放在头部这样continue的安全性更高。3.3 goto的争议与正确用法goto在教科书里名声不太好Dijkstra早就批判过说它会破坏结构化编程。但C语言保留goto是因为有些场景它确实方便。比如多层循环内部的错误处理一个函数需要清理多个资源时goto一跳到末尾统一清理比层层嵌套优雅得多。Linux内核代码里就有不少goto用于“错误处理单一出口”模式。但普通业务代码我的建议是能不用就不用如果非用只能向前跳不能向后跳而且跳跃范围要小最好控制在同一个函数内并且要有注释说明跳到哪一行干什么。绝对禁止用goto构建一个可读性极差的“面条代码”。实际编码中我最近一次用goto是在类似于“多层循环中检测到异常立即退出并返回错误码”的场景两层循环嵌套break只能跳一层特地去加标志变量反而绕goto反而直观。但要写成这样for (int i 0; i n; i) { for (int j 0; j m; j) { if (error_condition(i, j)) goto cleanup; } } cleanup: free(buf); return -1;这比found标志清晰。当然如果你写的是接口库或者公司规范不允许goto那就用标志变量吧。使用goto时还要注意跳过变量初始化的问题如果跳到标签处之后还要使用某个变量而这个变量的声明在跳转之后就可能导致“使用未初始化变量”的警告需要小心。4. 分支与循环的实战套路4.1 冒泡排序双重循环加分支交换冒泡排序是C语言入门必学算法正好把双重循环和if结合起来。基本思想是每一轮比较相邻元素如果顺序不对就交换经过n-1轮后最大元素像气泡一样浮到末尾。for (int i 0; i n - 1; i) { for (int j 0; j n - 1 - i; j) { if (arr[j] arr[j 1]) { int temp arr[j]; arr[j] arr[j 1]; arr[j 1] temp; } } }内层循环范围是n - 1 - i因为每完成一轮最后i个元素已经有序不需要再比较。这里最需要注意的细节是外层循环i n - 1不是i n内层j n - 1 - i不是j n。稍微不注意就会越界。越界在C语言里不一定会立刻崩溃但它可能悄悄改掉相邻内存的值导致难以排查的怪问题。如果数据本身近似有序可以加一个优化如果某一轮没有任何交换说明已经排好序直接break。这是经典的“冒泡排序优化版”代码只需要在内层循环的外面加一个int swapped 0在交换时置1每轮结束后判断一下。这个优化对数组完全有序时能把O(n²)降为O(n)虽然整体最坏复杂度不变但实测有收益。我在做数据量比较小的排序时更喜欢这种直观稳定的写法。4.2 字符串逆序循环、指针与数组边界字符串逆序是一道PTA高频题。要求把hello变成olleh。常见做法是双指针交换一个指针从头开始一个指针从strlen(str)-1开始两者向中间移动每步交换两个字符。void reverse(char *s) { int left 0; int right strlen(s) - 1; while (left right) { char temp s[left]; s[left] s[right]; s[right] temp; left; right--; } }循环条件是left right而不是left ! right因为当字符串长度是偶数时两者会交错如果用!会越界。这是很多初学者的坑。另外strlen返回的长度不包括最后的\0所以right要减1。处理字符串时要时刻记住\0的存在它既是字符串结束标志也是很多边界问题的根源。进阶一点如果要逆序整个句子的单词顺序但保持单词内部字符不变比如I love C变成C love I就需要先整体逆序再逐个单词逆序。这个题可以练到“双重循环条件分支”而且需要自己判断空格边界做完会很有成就感。我建议自己先写一遍再看别人怎么处理连续空格的情况这里特别容易漏。4.3 鞍点问题判断与循环的综合练习题目里提到了“计算5*5鞍点问题”这是很多学校在线练习平台上的经典题。鞍点的定义是在一个矩阵中某个元素是它所在行的最大值同时是它所在列的最小值。要求输出鞍点及其位置如果不存在则输出相应提示。思路很简单但容易写错。核心分两层先找每行的最大值位置再判断该位置是否是该列的最小值。一次循环可以搞定。具体步骤对每一行i先遍历该行找到最大值及其列号maxCol。遍历第maxCol列检查元素a[i][maxCol]是否是该列最小值。如果是记录鞍点和位置如果不是继续下一行。伪代码类似for (i 0; i row; i) { max a[i][0]; maxCol 0; for (j 1; j col; j) { if (a[i][j] max) { max a[i][j]; maxCol j; } } int isSaddle 1; for (k 0; k row; k) { if (a[k][maxCol] max) { isSaddle 0; break; } } if (isSaddle) { printf(Saddle: a[%d][%d]%d\n, i, maxCol, max); } }这个题的坑在于“存在多个相同最大值”时如何处理。严格的定义一般是“行最大值且列最小值”如果行内有多个相同的最大值通常约定取第一个或者都需要判断不同题目要求不同先看清题干。另一个容易出错的地方是找行最大值时初始值应该设为第一列元素并且循环从第二列开始或者用a[i][0]作初始不能随便用一个很大的负数否则可能把真正的最大值漏掉。我让学生做这个题时会额外要求他们用-1表示“未找到”并输出“NO”。因为很多在线评测系统对输出格式非常严格多打一个空格都是错。实际上这类题最考人的不是算法而是边界情况的完整性和输出格式的严谨性。5. 常见错误与调试技巧5.1 死循环循环变量为什么不更新死循环大多有三个原因循环变量没更新、条件永远为真、浮点数比较问题。排查时第一件事就是检查循环体里是否修改了循环变量。比如for (int i 0; i 10; )漏了iwhile (i 10)里忘了i或者在if里提前continue跳过了更新。我常用一个土办法在循环体开头打印循环变量看它的变化规律。用printf(i%d\n, i);如果打印出来的值一直不变问题就清楚了。当然在生产代码里不要留这种调试输出用调试器断点更好。还有一种隐蔽的死循环在循环体内通过scanf读取数据如果输入格式不匹配scanf会返回0但变量没被赋值循环条件可能一直不满足退出形成“假死”。比如while (scanf(%d, n) ! EOF)如果输入了非数字字符scanf返回0但没到EOF循环会一直执行并返回0整个人感觉就像死循环了。处理方法是检查scanf返回值并考虑把不合法输入消耗掉。5.2 分号陷阱、花括号缺失与悬挂else前面说过if后面加个分号的坑这里再强调一次。不只是ifwhile也有这个问题while (i 10); { i; }如果while后面直接跟分号就会形成死循环因为循环体是空语句i永远不会更新后面的花括号只是独立代码块。这个错几乎每个人都犯过。有一种情况是有意使用比如写一个空循环用于延时while (--n);这是有意的但一定要加注释说明这是空循环延时。否则别人看到还以为是你手误写了个分号。花括号缺失造成的问题更隐蔽。如果循环体只有一条语句可以不用花括号但一旦你后来往里面加语句极容易只加了一句第二句就落到循环外面去了。所以我的习惯是不管循环体多短都写花括号至少让逻辑边界清晰。这类bug在代码review里很难一眼发现因为缩进看起来似乎是对的但实际执行跟缩进无关。5.3 用GDB和printf定位逻辑错误分支和循环的逻辑错误用眼睛看往往很难发现。调试工具可以帮大忙。GDB是Linux下最常用的C调试器可以在循环内部设置断点查看变量值。比如gcc -g program.c -o program gdb ./program break main run next print i continue也可以用条件断点比如break 15 if i 5让程序在i等于5时停下来适合排查特定迭代的问题。如果不想用命令行VSCode里也可以配置gdb调试图形化更直观。如果调试器一时用不顺手printf大法也很有效。但要注意有时候加printf的位置不对会改变程序行为比如在并行程序里不过单线程C程序一般没事。关键是要学会“二分定位”先确认前半段逻辑是否正确再确认后半段而不是到处塞printf。比如一个复杂双重循环先确认外层循环每次进入时状态正确再检查内层循环。另一个技巧是使用断言assert。在循环不变量处加assert(i 0)一旦条件不满足程序立刻终止并报错。这比printf更高效。比如冒泡排序外循环每次开始时可以断言i 0 i n帮助尽早发现问题。assert在发布版本里通常会被定义为空所以不增加运行时开销但在调试版本里非常有用。6. 代码风格、性能与工程习惯6.1 可读性优先循环与分支的命名和缩进写分支和循环时变量命名直接决定可读性。别用a、b、i、j满天飞。循环变量i、j作为约定俗成可以但含义复杂的变量要起名字比如row、col、maxIndex。条件表达式里不要写太复杂的长表达式可以拆分成有名字的布尔变量。比如int isLeapYear (year % 4 0 year % 100 ! 0) || (year % 400 0); if (isLeapYear) { ... }这比在if里直接放一长串条件更容易理解。代码是写给人看的编译器不在乎变量名多长。我宁愿看到customersWithOverdueBills也不愿意看到x。缩进要统一我习惯用四个空格不用Tab避免在不同编辑器里显示错位。花括号的放置风格KR还是Allman其实都可以只要团队统一。但不要一会儿左括号换行一会儿不换行很影响阅读。另外循环体里的变量声明最好在最小作用域内声明比如for (int i 0; ...)C99之后支持这样既清晰又避免变量污染外层命名空间。6.2 分支与循环的常见性能误区初学者经常听人说“循环效率低”于是在处理小数据时也绞尽脑汁优化其实没必要。现代编译器很聪明会做循环展开、分支预测等优化。我们首先要保证逻辑正确再考虑性能。真正影响性能的情况通常是循环体内重复计算与循环变量无关的表达式。比如for (j 0; j strlen(s); j)每次循环都调用strlen如果s不变这会把O(n²)复杂度塞进O(n)循环里。正确做法是int len strlen(s); for (j 0; j len; j)。分支顺序不合理。一条if-else链中把最可能命中按实际数据分布的条件放在最前面减少平均判断次数。虽然现代CPU有分支预测但在热点代码中还是有效果。过度优化导致可读性下降。比如用位运算代替简单除法、把循环体写成一行收益通常很小还可能引入bug。如果真想优化建议先profiling用perf或时间统计找出热点再针对性地改。大多数瓶颈在算法复杂度层面改几个循环结构远远不如换个算法。比如把一个O(n²)的双重循环改为O(n log n)的排序或查找比在循环里加几个register快得多。6.3 从一个题目到一类题目分支循环的思维模型最后说说思维层面。我辅导过很多人学C他们卡在分支和循环往往不是语法不会而是面对题目不知道如何下手。我总结了一个简单的思维模型先读题找出“需要对什么数据做重复操作”——这就是循环的主体。找出“什么情况下要终止重复”——这是循环条件。找出“每一步重复中根据情况差异化处理的地方”——这是分支的切入点。确定循环里哪些状态是跨迭代要保持的比如累加器、计数器、最小值、位置标记。比如算一个数组的平均值遍历数组是循环主体遍历完整个数组是终止条件没有差异化分支但有累加器sum。再比如统计成绩等级遍历每个成绩是循环主体每个学生遇到不及格、及格、优秀是不同的分支并分别计数。先搭骨架再填代码远比边想边写更稳。遇到双层循环可以用“行-列”思路外循环画行内循环画列。输出图形、矩阵运算、排序算法都适用。这种思维一旦建立你会发现很多题目其实是一回事。还有一类是“穷举判断”比如找素数、找鞍点都是在循环里做条件判断把不符合条件的过滤掉。本质上就是把“所有可能性”遍历一遍再用分支筛选出“满足条件的解”。这个模式非常常见值得专门练习。我在实际操作中的体会是分支和循环不是孤立知识点它们是程序逻辑的“乐高积木”。面试和考试中真正考的不是语法而是你能不能通过组装这些积木在资源受限的情况下解决问题。多练几个典型题比如九九乘法表、冒泡排序、字符串逆序、鞍点基本就能把这些积木玩熟了。练的时候别光看答案自己动笔推演几遍再在电脑上敲出来编译、运行、调试踩过坑印象才深刻。写完这些如果还有余力可以试试PTA或头歌里那些分支循环题目翁恺老师的慕课配套题也不错。刚开始做不出来很正常但只要你坚持练一个月后回头看会发现这些以前觉得“高深”的东西不过是日常工具罢了。这就是C语言入门最实在的路径。

相关新闻

从 Ming-Omni 到 Ming-UniVision 再到 Ming-Image:蚂蚁视觉模型的连续叙事

从 Ming-Omni 到 Ming-UniVision 再到 Ming-Image:蚂蚁视觉模型的连续叙事

从 Ming-Omni 到 Ming-UniVision 再到 Ming-Image:蚂蚁视觉模型的连续叙事 【免费下载链接】Ming-Image-0.1-Design 项目地址: https://ai.gitcode.com/hf_mirrors/inclusionAI/Ming-Image-0.1-Design 如果说 2025 年多模态大模型的主战场是"一张架构吃…

2026/10/10 13:53:32 阅读更多 →
C#语法从入门到进阶:类型系统、LINQ与异步编程全解析

C#语法从入门到进阶:类型系统、LINQ与异步编程全解析

1. 别急着写代码,先看懂 C# 的脾气我见过不少半路转 C# 的开发者,上来就抄着 Java 的习惯写,结果处处碰壁。也有学了 Python 再来看 C# 的,第一反应是“这玩意儿怎么这么啰嗦”。但只要你摸清 C# 的设计思路,会发现它其…

2026/10/10 13:53:32 阅读更多 →
Armada RGB灯效服务深度剖析:Rust如何实现设备树模型识别与LED控制

Armada RGB灯效服务深度剖析:Rust如何实现设备树模型识别与LED控制

【免费下载链接】armada SteamOS-like ARM handheld distro 项目地址: https://gitcode.com/gh_mirrors/armada5/armada 点击查看 免费下载 🎮 Armada 是一个类 SteamOS 的 ARM 掌机发行版,其中的 armada-rgb 服务用 Rust 编写,负…

2026/10/10 13:53:32 阅读更多 →

最新新闻

汽车零部件目标检测数据集详解:VOC/YOLO双格式转换与训练避坑指南

汽车零部件目标检测数据集详解:VOC/YOLO双格式转换与训练避坑指南

简介:面向目标检测与汽车零部件视觉识别开发者,该资源提供了一套覆盖50类常见零部件的标注数据集,适用于产线质检、维修辅助、自动驾驶感知等场景,也可用于算法教学与模型验证。据资源描述,数据集整体按Pascal VOC与YO…

2026/10/10 14:35:32 阅读更多 →
火焰烟雾数据集YOLO.zip全流程:数据体检、训练避坑与ONNX部署

火焰烟雾数据集YOLO.zip全流程:数据体检、训练避坑与ONNX部署

简介:火焰烟雾检测数据集YOLO.zip,面向深度学习目标检测开发者,尤其适合使用YOLO框架进行火焰烟雾识别与工程化落地的用户。图片清晰、场景覆盖广泛,所有数据均经人工精心挑选与标注,可直接作为通用模板训练火焰烟雾检…

2026/10/10 14:35:32 阅读更多 →
JSP供应链管理系统毕业设计实战指南

JSP供应链管理系统毕业设计实战指南

简介:本资源是一套面向计算机专业本科生的毕业设计级JSP供应链管理系统实战项目,适用于Web开发初学者巩固Servlet/JSP、MySQL数据库及MVC分层思想。系统聚焦百货中心实际业务场景,完整覆盖管理员登录、合作公司管理、采购流程管控与多维度数据…

2026/10/10 14:35:32 阅读更多 →
MediaPipe姿态估计实现仰卧起坐计数的可复现方案

MediaPipe姿态估计实现仰卧起坐计数的可复现方案

简介:本资源是一套基于Python与MediaPipe实现的AI健身动作识别系统,专为计算机视觉初学者、人工智能实践者及体育科技爱好者设计,解决仰卧起坐自动计数与动作规范性评估的技术落地问题。压缩包共5个文件,含2个核心Python脚本&…

2026/10/10 14:35:32 阅读更多 →
自测代码设计与实现:Go+JavaScript构建开发期自我校验闭环

自测代码设计与实现:Go+JavaScript构建开发期自我校验闭环

简介:这是一份基于Go与JavaScript实现的跨平台代码自测源码库,主要面向需要搭建轻量级自测工具集、希望在开发前后快速检验代码质量的Go/JavaScript开发者。压缩包共25个文件,以11个Go源码文件为核心,搭配XML配置、YAML数据序列化…

2026/10/10 14:35:32 阅读更多 →
Java五子棋网络对战毕设:TCP Socket实战源码与工程解析

Java五子棋网络对战毕设:TCP Socket实战源码与工程解析

简介:本资源是一套面向计算机专业本科生的Java毕设实战项目,聚焦手机端五子棋网络对战游戏的设计与实现,适用于Java初学者向中阶开发者进阶,尤其适合需完成毕业设计、夯实网络编程与GUI开发能力的学生。压缩包共5.55MB&#xff0c…

2026/10/10 14:34:30 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →