Day5语法:循环-分支语句
目录1. 语句2. C 程序结构3. 分支语句3.1 if 语句3.1.1 形式一单分支 if3.1.2 形式二if-else3.1.3 形式三if-else if-else3.1.4 练习3.1.5 if 语句总结3.2 switch3.2.1 语法形式3.2.2 注意事项3.2.3 作业4. 循环语句4.1 简介4.2 goto 语句4.3 while 语句4.4 do-while 语句4.5 for 循环4.6 循环的嵌套4.7 break 和 continue1. 语句C 语言中语句指令就是表达程序员某个操作的意图。语句是 C 程序的基本执行单元它表示一个完整的操作每一条语句都是以;结束。语句可以分为单语句和复合语句。单语句常见形式赋值语句int a 10;函数调用语句printf(hello world\n);空语句;什么都不做复合语句是由一对花括号{}括起来的语句块代码块可以包含多个语句{ a 22; b a 13; c a b; // ...... }常见的流程控制语句包括if、switch、while、do while、for等。C 程序主体由函数组成函数内部由 C 语句组成。2. C 程序结构结构化程序设计提供三种控制结构顺序结构所有语句按照线性顺序执行。分支结构选择结构例如在 A、B 之间做出选择。循环结构重复执行指定的语句。早在 1966 年就已经证明以上三种基本结构可以构成任意复杂的算法。3. 分支语句分支结构选择结构用于在多个分支中做出选择。C 语言中的分支语句主要包括if语句和switch语句。3.1 if 语句if 语句用于条件判断满足条件时就执行指定的语句。if 语句有三种基本形式。3.1.1 形式一单分支 ifif(表达式) 语句如果“表达式”为真非 0表示条件成立则执行后面的“语句”。合法的表达式就一定会有值。常见的表达式有算术表达式a b逻辑表达式a b函数调用sum(a, b)if 条件成立时表达式的值为非 0if 条件不成立时表达式的值为 0。分析如下程序的结果示例 1int a 3, b 6; if(a b) a 4; // a b 结果为假此句没有执行 b 3; // 执行 printf(a:%d b:%d \n, a, b); // 输出a:3 b:3规则if 语句的作用域仅限于其后面的单条语句。如果希望多条语句被 if 管理可以使用{}指定if(a b) { a 4; b 3; }示例 2int a 4, b 3; if(a b); // 此处有分号 ; 代表一个空语句 a 5; printf(a: %d\n, a);编程建议为了避免上述混乱情况提高程序可读性建议不管 if 后面有没有语句都先加上{}确定范围if(xxx) { // 语句块; }3.1.2 形式二if-elseif(条件1) { 语句1 } else { 语句2 }假设条件 1 成立非 0则执行对应的语句 1否则执行语句 2。else 不能单独存在一定要和一个 if 匹配。练习从键盘获取用户输入的一个整数利用 if-else 语句判断其是否为偶数。if(n % 2 0) { printf(偶数\n); } else { printf(奇数\n); }3.1.3 形式三if-else if-elseif(条件1) { 语句1 } else if(条件2) { 语句2 } else if(条件3) { 语句3 } else { // 如果上述条件都不满足则执行此处 }这种结构适用于需要按优先级顺序逐个检查的情况。在每个条件后面跟随一个 else if只有在前一个条件为假时才会继续检查下一个条件如果所有的表达式都不成立则进入 else。示例根据学生成绩 score 打出对应的等级分。if(score 90) { printf(A\n); } else if(score 80) { printf(B\n); } else if(score 60) { printf(C\n); } else { printf(D\n); }用户输入 90 分时仅输出 A。各个条件按照优先级查找满足条件时执行对应的代码块。区别于以下写法if(score 90) { printf(A\n); } if(score 80) { printf(B\n); } if(score 60) { printf(C\n); } else { printf(D\n); }用户输入 90 分时A、B、C 都会输出。3.1.4 if 语句总结1. 并列条件与互斥条件// 并列条件 if(条件1) { ... } if(条件2) { ... } if(条件3) { ... } // 互斥条件 if(条件1) { ... } else { ... }2. if 语句的嵌套在某个大的条件下再细分条件。在 if 语句中包含一个或者多个 if称之为 if 嵌套。if(A) { if(C) { } else if(D) { } else { } } else { }注意 else 匹配原则else 总是与它上面最近的、同级的、未配对的 if 语句匹配。练习判断从键盘输入的内容是否为字母A~Z、a~z如果是小写字母则输出其大写如果是大写字母则输出其小写。提示ASCII 码虚拟机终端输入man ascii查看按 q 退出。scanf(%c, ch);用于获取输入。// 获取用户输入判断是否为字母 char ch; printf(请输入一个字母: ...\n); scanf(%c, ch); if((ch A ch Z) || (ch a ch z)) { printf(输入的字符是字母\n); // 进一步判断是大写还是小写 if(ch A ch Z) // 大写 { ch ch (a - A); // 大写转小写 printf(转换为小写: %c\n, ch); } else if(ch a ch z) { ch ch - (a - A); // 小写转大写 printf(转换为大写: %c\n, ch); } } else { printf(输入的字符不是字母\n); }3.2 switchswitch 用来列举表达式所有可能的情况并进行匹配。3.2.1 语法形式switch(表达式) { case 常量表达式1: 语句1 break; // 跳出 case 常量表达式2: 语句2 break; case 常量表达式m: 语句m break; default: // 建议将 default 写在最后 语句 break; }常量表达式是程序运行期间值不会改变的表达式。例如下面的 case 写法都是正确的#define N 122 switch(num) { case N: // define 在预处理阶段替换相当于 case 122: case 5: case A: case z: case 3 5: case a 32: break; }错误示例int a 3; switch(num) { case a 1: // 错误case 后不能使用变量 break; }switch 让“表达式”和 case 后面的“常量表达式”做匹配。一旦匹配成功值相等则从那个 case 后面开始执行直到遇到 break。如果所有的 case 都没有匹配成功则匹配 default。3.2.2 注意事项1. switch 后面的“表达式”必须是一个可以列举的值表达式的类型必须是整数值整型 int、字符型 char、枚举。int num; switch(num) { // ... }2. case 后面的“常量表达式”也必须是一个整数值不能是变量并且每个 case 后面的常量表达式的值必须不同。// 正确写法 switch(num) { case 1: break; case 2: break; } // 错误写法case 1 出现了两次 switch(num) { case 1: // AAAAA break; case 1: // BBBBB break; }3. 各个 case 和 default 出现的次序不影响匹配结果。一旦匹配成功就从此处往下执行直到遇到 break 或者 switch 语句结束。int a 5; switch(a) { // default 是所有 case 都不匹配时才会执行 default: ... case 1: ... case 2: ... case 5: a 20; // 匹配此处并执行 break; // 此处跳出 case 6: ... }4. “语句”可以省略多个 case 可以共用一组语句switch(a) { case 1: case 2: // a 为 1 或者 2 时都执行此处 ... case 3: ... }5. switch 中的 break 用来跳出它所属的 switch 语句switch(a) { case 1: case 2: ... case 3: break; default: ... }4. 循环语句先看一个场景通过程序实现求 12345...n 的和。int sum 0; // 用于保存累加的值 int n 1; // 要加的数 sum sum n; // 01 n; // 1--2 sum sum n; // 12 n; // ...... // 如果求到 n就需要重复执行 n 次 // ---- 循环4.1 简介循环的本质是重复。所有重复的代码都可以用循环来实现。在 C 程序中能够起到循环效果的语句如下if和goto构造循环while语句do while语句for语句其中if和goto并不算严格意义上的循环语句只是起到循环效果。4.2 goto 语句goto语句可以让 CPU 跳转到指定位置执行是一种无条件跳转语句。goto 行标识;“行标识”用于标识一行代码需要符合 C 语言标识符的命名规则由字母、数字、下划线组成不能以数字开头不能和关键字冲突。本质上它就代表了一个地址。loop: sum sum n; n; goto loop;通过 goto 实现十次循环打印 1-10int main() { int n 1; loop: printf(loop: n %d\n, n); n; if(n 10) { goto loop; } printf(loop end\n); return 0; }注意goto 类似于汇编代码的无条件跳转通常被认为是不好的编程风格会让代码难以调试和阅读因此平时尽量不要使用 goto 来做循环。4.3 while 语句while(表达式) { // 语句块 }当“表达式”的值为真非 0时执行“语句块”然后跳回 while 处继续判断如此重复直到“表达式”的值为假0为止。“表达式”可以是任意合法的 C 表达式只要有值。“语句块”是循环体是重复执行的部分可以是单语句也可以是复合语句。int sum 0; int i 1; while(i 100) sum i; i; // 此句不会参与循环编程建议不管 while 后面有没有语句都先加上大括号{}确定范围while(xxx) { // 要循环的内容 }练习 1逆序输出一个 3 位正整数。输入 123输出 321。int main() { int a 0; // 用于获取用户输入的数 int d 0; // 用于存储每一个位 printf(请输入一个三位的正整数\n); scanf(%d, a); // a 不为 0 则继续循环 while(a) { d a % 10; // 取出末位 printf(%d, d); // 打印末位 a a / 10; // 处理剩余位数 } return 0; }练习 2求 100 以内 3 的倍数的和。int main() { int n 1; // 表示 100 以内的某个数 int sum 0; // 用于累计它们的和 while(n 100) { if(n % 3 0) { sum n; } n; } printf(sum :%d\n, sum); return 0; }4.4 do-while 语句do // 语句 while(表达式);程序先执行“语句”然后再判断“表达式”的值。当值为真非 0时跳转到上面继续执行“语句”如此重复直到“表达式”的值为假0为止。翻译成 goto 语句loop: 语句 t 表达式; if(t) { goto loop; }示例int i 0; int sum 0; do i; sum i; while(i 100); printf(sum %d\n, sum);如果 do 后面不加花括号上述代码会报错error: expected ‘while’ before ‘sum’。应改成int i 0; int sum 0; do { i; sum i; } while(i 100); printf(sum %d\n, sum);编程建议使用 do-while 时先给 do 后打一对{}确定范围do { } while();while 和 do-while 的区别主要在于条件判断的时机while 在每次循环开始前判断do-while 在每次循环结束后判断。如果希望至少执行一次循环可以使用 do-while如果希望每次开始前先判断可以使用 while。特殊示例 do while(0)遇到复杂逻辑需要分步提前退出时可以尝试使用 do-while(0)。int a 0, b 0, c 0; // 用于存储边长 scanf(%d%d%d, a, b, c); do { if(a b c) { printf(no\n); break; } if(a c b) { printf(no\n); break; } if(b c a) { printf(no\n); break; } // 当上述任意一个条件不满足时会提前 break 退出 printf(最终: 满足三角形要求\n); } while(0);4.5 for 循环for(initialization; continuation; action) { statement; }其中 initialization 是初始化表达式用于初始化循环变量只执行一次continuation 是判断表达式只要为真就会不断执行循环体action 是循环变量处理表达式每轮循环结束后执行使得循环变量产生变化。更常见的形式for(表达式1; 表达式2; 表达式3) { 语句 }先执行一次表达式 1然后判断表达式 2 的值如果为真执行语句再执行表达式 3如此重复直到表达式 2 为假。三个表达式都可以省略但两个分号不能省略for( ; ; ) { // 如果表达式 2 省略表示 for 循环的执行条件永远为真 }for 和 while 的区别一般来说 while 更注重循环条件for 更注重循环次数两者可以互相替换。练习求“水仙花数”。水仙花数是三位数100-999且个位、十位、百位的立方和等于其本身。int x 100; int a, b, c; // 表示 x 的每一位 for(x 100; x 999; x) { a x % 10; // 个位 b (x / 10) % 10; // 十位 c x / 100 % 10; // 百位 if((a * a * a b * b * b c * c * c) x) { printf(找到水仙花数: %d\n, x); } }附C 中使用pow做幂运算double pow(double x, double y); int a 3; // 例如求 3 的 4 次方 printf(%.0f\n, pow((double)a, 4.0)); // 在 Ubuntu 中使用 gcc 编译时需要连接 -lm // gcc 1.c -lm4.6 循环的嵌套示例打印 3 行 6 列全为 0 的矩阵。for(int j 0; j 3; j) { for(int i 0; i 6; i) { printf(0 ); } printf(\n); }4.7 break 和 continuebreak跳出当前的循环或 switch 语句continue结束本次循环继续下一次循环。示例 1continueint i 10; int sum 0; while(i--) { if(i 5) { continue; sum i; // 不会执行到此处 } else { sum i; } } printf(sum %d\n, sum); // 54321示例 2breakint i 10; int sum 0; while(i--) { if(i 5) break; // 直接跳出整个 while 循环 else sum i; } printf(sum %d\n, sum); // 0

相关新闻

图形重绘与数组学习小结

图形重绘与数组学习小结

在开发画图工具的过程中,我遇到了一个问题:为什么画好的图形在窗口最小化或被遮挡后就会消失?我利用“数组”和“重绘机制”解决了这个问题。 问题的根源: 最初,我的绘图逻辑非常直接:在鼠标事件&#xff0…

2026/10/11 23:08:39 阅读更多 →
跨境数据流动合规指南:GDPR、PIPL与CLOUD法案下的技术架构挑战与破局

跨境数据流动合规指南:GDPR、PIPL与CLOUD法案下的技术架构挑战与破局

1. 跨境数据流动的“巴别塔”:一个全球性难题的缘起如果你在一家业务遍布全球的科技公司工作,或者负责过涉及海外用户数据的项目,那么“数据跨境”这个词,大概率会让你眉头一皱。这绝不是一个简单的技术传输问题,而是一…

2026/10/9 10:17:59 阅读更多 →
Mac本地部署OpenClaw:从环境配置到性能优化的完整指南

Mac本地部署OpenClaw:从环境配置到性能优化的完整指南

1. 项目概述:为什么要在Mac上折腾OpenClaw?最近在开发者圈子里,OpenClaw这个名字的讨论热度不低。简单来说,它是一个开源的、旨在提供类似某些云端智能助手核心能力的本地化项目。对于Mac用户,尤其是开发者、研究者和对…

2026/10/11 0:17:21 阅读更多 →

最新新闻

cursor: not-allowed 与 pointer-events: none 实战:TaoToken 控制台里禁用态按钮的样式与事件双保险

cursor: not-allowed 与 pointer-events: none 实战:TaoToken 控制台里禁用态按钮的样式与事件双保险

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

2026/10/12 13:03:12 阅读更多 →
震惊!2025大模型技术革命:从推理到编程智能体,小白程序员的进阶之路与TaoToken实战

震惊!2025大模型技术革命:从推理到编程智能体,小白程序员的进阶之路与TaoToken实战

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

2026/10/12 13:03:11 阅读更多 →
大模型编程助手Trae接入TaoToken:统一Key配置与多模型切换实战

大模型编程助手Trae接入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/12 13:03:11 阅读更多 →
OpenClaw机器人引爆天网!首次拥有世界记忆,天网在GitHub「开源」了:用TaoToken统一Key打通LiDAR+SLAM+ROS全链路

OpenClaw机器人引爆天网!首次拥有世界记忆,天网在GitHub「开源」了:用TaoToken统一Key打通LiDAR+SLAM+ROS全链路

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

2026/10/12 13:03:11 阅读更多 →
可审计的AI数据分析师:用Agents API安全访问数据库

可审计的AI数据分析师:用Agents API安全访问数据库

日志系统里躺着一行触目惊心的记录: DELETE FROM users WHERE id 1024 ,执行时间是凌晨 03:22:17,发起方是一段名为“数据分析助手”的自动化脚本。看到这行日志的那一刻,我的第一反应是:谁把生产库的连接串直接喂给…

2026/10/12 13:03:11 阅读更多 →
大一新生年入百万?拆解流量造神背后的真实玩法与路径

大一新生年入百万?拆解流量造神背后的真实玩法与路径

大一新生,年入100万,别人都叫他“天才小火炬”。这种标题这两年刷到过不止一次,第一反应基本都是“又一个流量造神”。但把这些案例里的账号内容、产品路径、粉丝互动记录翻了很多遍之后,有一个结论我越来越确定:这里面…

2026/10/12 13:02:11 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →