news 2026/5/24 8:38:55

【C 语言系统入门教程】第 3 讲:分支和循环(上) | 零基础学习笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【C 语言系统入门教程】第 3 讲:分支和循环(上) | 零基础学习笔记

【C 语言系统入门教程】第 3 讲:分支和循环(上) | 零基础学习笔记

本系列为 C 语言零基础系统学习笔记,配套课程课件内容,持续更新中~本文为系列第 3 讲,是 C 语言结构化程序设计的核心篇章,完整覆盖分支结构、循环结构两大核心程序逻辑,从基础语法到代码实操,拆解 if、switch、三大循环、break/continue 等核心语法,带你从 “写得出代码” 进阶到 “写得好逻辑”,全程零基础友好,可直接复制代码运行调试。

系列往期笔记:第 1 讲:C 语言常见概念 | 第 2 讲:C 语言数据类型和变量


🎯 本讲学习目标

  1. 掌握if分支语句的完整用法,包括单分支、双分支、多分支嵌套,彻底规避悬空 else的经典坑点

  2. 熟练使用 6 种关系操作符,区分===的核心差异,规避关系运算符连用的逻辑错误

  3. 掌握条件操作符(三目运算符)的语法与使用场景,能简化简单的分支代码

  4. 掌握!&&||三大逻辑操作符,理解短路求值的底层原理,能完成复杂逻辑表达式的编写

  5. 掌握switch分支语句的语法规则,明确breakdefault的核心作用,能根据场景选择 if/switch 实现分支

  6. 掌握whilefordo-while三大循环的语法、执行流程与核心差异,能根据场景选择合适的循环

  7. 熟练运用breakcontinue关键字控制循环执行流程,明确二者在不同循环中的行为差异

  8. 掌握循环嵌套的编写逻辑,能完成素数判断等基础嵌套循环场景

  9. 了解goto语句的语法、适用场景与使用禁忌,规避滥用 goto 导致的代码逻辑混乱


📚 核心学习内容

C 语言是结构化的程序设计语言,核心支持三种程序结构:顺序结构、选择结构(分支)、循环结构

  • 分支结构:使用ifswitch语句实现,根据条件判断执行不同的代码逻辑

  • 循环结构:使用forwhiledo-while语句实现,让代码重复执行,减少冗余

1. if 语句

if语句是 C 语言中最基础、最常用的分支实现方式,通过条件表达式的真假,决定代码是否执行。

C 语言中,0 表示假,非 0 表示真:表达式结果为 0,语句不执行;结果为非 0,语句执行。

1.1 单分支 if 语句
语法格式
if (表达式) 语句;
  • 表达式成立(为真),则执行语句;表达式不成立(为假),语句不执行

  • 若需要控制多条语句,必须用{}包裹成复合语句(代码块)

代码实操:判断奇数
#include <stdio.h> ​ int main() { int num = 0; scanf("%d", &num); // 判断是否为奇数:对2取余结果为1 if(num % 2 == 1) printf("%d 是奇数\n", num); return 0; }
1.2 双分支 if...else 语句

当条件成立和不成立时,需要执行不同的逻辑,使用if...else...双分支结构。

语法格式
if (表达式) 语句1; else 语句2;
  • 表达式为真,执行语句 1;表达式为假,执行语句 2

  • 二者只会执行其中一个,不会同时执行

代码实操:判断奇数 / 偶数
#include <stdio.h> ​ int main() { int num = 0; scanf("%d", &num); if(num % 2 == 1) printf("%d 是奇数\n", num); else printf("%d 是偶数\n", num); return 0; }
1.3 分支中包含多条语句

ifelse默认只能控制一条语句,如果需要控制多条语句,必须使用{}将代码包裹成复合语句(代码块),否则会出现逻辑错误。

错误示例
#include <stdio.h> ​ int main() { int age = 0; scanf("%d", &age); // 错误:if只能控制第一行printf,第二行无论条件真假都会执行 if(age >= 18) printf("成年了\n"); printf("可以谈恋爱了\n"); return 0; }

问题:无论输入的年龄是否≥18,"可以谈恋爱了"都会被打印,因为 if 无法控制第二行语句。

正确示例
#include <stdio.h> ​ int main() { int age = 0; scanf("%d", &age); // 用{}包裹多条语句,if可控制整个代码块 if(age >= 18) { printf("成年了\n"); printf("可以谈恋爱了\n"); } else { printf("未成年\n"); printf("不可以早恋哦\n"); } return 0; }

❗ 高频易错点提醒:即使 if/else 后只有一条语句,也建议加上{},养成良好的代码规范,避免后续新增代码时出现逻辑错误。

1.4 嵌套 if

if else语句中,else可以与另一个if语句连用,构成多重判断,实现更复杂的分支逻辑。

代码实操 1:判断数字是 0、正数还是负数
#include <stdio.h> ​ int main() { int num = 0; scanf("%d", &num); if(num == 0) printf("输入的数字是0\n"); else if(num > 0) // if嵌套在else中,构成多分支 printf("输入的数字是正数\n"); else printf("输入的数字是负数\n"); return 0; }
代码实操 2:年龄段分级判断

需求:输入年龄,<18 岁打印少年,18-44 岁打印青年,45-59 岁打印中老年,60-89 岁打印老年,90 岁及以上打印老寿星。

#include <stdio.h> ​ int main() { int age = 0; scanf("%d", &age); if(age < 18) { printf("少年\n"); } else if(age <= 44) { printf("青年\n"); } else if(age <= 59) { printf("中老年\n"); } else if(age <= 89) { printf("老年\n"); } else { printf("老寿星\n"); } return 0; }
1.5 悬空 else 问题

这是 if 语句的经典坑点,必须牢记核心规则:else 总是跟最接近的、未匹配的 if 匹配,与代码排版无关。

经典错误示例
#include <stdio.h> ​ int main() { int a = 0; int b = 2; if(a == 1) if(b == 2) printf("hehe\n"); else // 视觉上与第一个if对齐,实际与第二个if匹配 printf("haha\n"); return 0; }

新手误区:认为 a=0,第一个 if 不成立,会执行 else 打印 haha;实际运行结果:什么都不输出

核心原因:else 与最接近的第二个 if 匹配,整个if(b==2)...else...都嵌套在第一个 if 中,第一个 if 不成立,内部代码完全不会执行。

正确写法:用 {} 明确代码块边界
#include <stdio.h> ​ int main() { int a = 0; int b = 2; // 希望else与第一个if匹配,用{}明确边界 if(a == 1) { if(b == 2) printf("hehe\n"); } else { printf("haha\n"); } return 0; }

✅ 最佳实践:无论 if/else 后有几条语句,都用{}包裹代码块,彻底规避悬空 else 问题,提升代码可读性。


2. 关系操作符

C 语言中用于比较的表达式称为 “关系表达式”,里面使用的运算符称为 “关系操作符”,共 6 个,用于实现分支 / 循环的条件判断。

关系操作符含义示例结果(真返回 1,假返回 0)
>大于5 > 31
<小于5 < 30
>=大于等于5 >= 51
<=小于等于5 <= 30
==相等5 == 51
!=不相等5 != 31
核心特性
  • 关系表达式的返回值只有两种:1(真)0(假)

  • 常用于 if、while 等结构的条件判断

高频易错点
  1. 混淆相等运算符==和赋值运算符=

    • 错误写法:if(x = 3),含义是给 x 赋值 3,表达式返回值为 3(非 0,恒为真),会导致条件判断永远成立

    • 正确写法:if(x == 3),含义是判断 x 是否等于 3

    • 防错技巧:将常量写在左边,if(3 == x),如果误写为3 = x,编译器会直接报错,提前规避问题。

  2. 多个关系运算符连用

    关系运算符是从左到右计算的,多个连用无法达到 “判断区间” 的效果,会出现逻辑错误。

    • 错误示例:判断年龄是否在 18~36 岁之间

      // 错误:输入10时,依然会打印"青年" if(18 <= age <= 36) { printf("青年\n"); }

      执行逻辑:先计算18 <= 10,结果为 0(假);再计算0 <= 36,结果为 1(真),最终条件成立,逻辑完全错误。

    • 正确写法:用逻辑与运算符

      &&

      连接两个条件

      // 正确:同时满足两个条件,才会成立 if(age >= 18 && age <= 36) { printf("青年\n"); }

3. 条件操作符

条件操作符也叫三目操作符,是 C 语言中唯一需要 3 个操作数的运算符,用于简化简单的 if-else 双分支代码。

语法格式
exp1 ? exp2 : exp3
执行逻辑
  • 如果exp1为真,执行exp2exp2的结果就是整个表达式的结果

  • 如果exp1为假,执行exp3exp3的结果就是整个表达式的结果

代码实操
示例 1:简化 if-else 分支
// 原始if-else写法 #include <stdio.h> int main() { int a = 0; int b = 0; scanf("%d", &a); if(a > 5) b = 3; else b = -3; printf("%d\n", b); return 0; } ​ // 条件操作符简化写法 #include <stdio.h> int main() { int a = 0; int b = 0; scanf("%d", &a); b = a > 5 ? 3 : -3; // 一行代码实现双分支逻辑 printf("%d\n", b); return 0; }
示例 2:找两个数中的较大值
#include <stdio.h> ​ int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); int max = a > b ? a : b; // 三目运算符取最大值 printf("较大值:%d\n", max); return 0; }

使用建议:仅用于简化简单的双分支逻辑,复杂分支不建议使用,否则会降低代码可读性。


4. 逻辑操作符: && , || , !

逻辑运算符用于构建复杂的条件判断,实现 “并且、或者、取反” 的逻辑关系,共 3 个。

核心规则:C 语言中,非 0 表示真,0 表示假。

4.1 逻辑取反运算符!

单目操作符,用于翻转单个表达式的真假:真变假,假变真。

表达式 a!a
非 0(真)0(假)
0(假)1(真)
代码实操
#include <stdio.h> ​ int main() { int flag = 0; // 如果flag为假,执行代码 if(!flag) { printf("do something\n"); } return 0; }
4.2 逻辑与运算符 &&

双目操作符,表示并且的含义,只有两侧的表达式都为真,整个表达式才为真;只要有一个为假,整个表达式就为假。

表达式 a表达式 ba && b
非 0(真)非 0(真)1(真)
非 0(真)0(假)0(假)
0(假)非 0(真)0(假)
0(假)0(假)0(假)
代码实操:判断春季
#include <stdio.h> ​ int main() { int month = 0; scanf("%d", &month); // 3月~5月是春季,必须同时满足两个条件 if(month >= 3 && month <= 5) { printf("春季\n"); } return 0; }
4.3 逻辑或运算符 ||

双目操作符,表示或者的含义,两侧的表达式只要有一个为真,整个表达式就为真;只有两侧都为假,整个表达式才为假。

表达式 a表达式 ba || b
非 0(真)非 0(真)1(真)
非 0(真)0(假)1(真)
0(假)非 0(真)1(真)
0(假)0(假)0(假)
代码实操:判断冬季
#include <stdio.h> ​ int main() { int month = 0; scanf("%d", &month); // 12月、1月、2月是冬季,满足任意一个条件即可 if(month == 12 || month == 1 || month == 2) { printf("冬季\n"); } return 0; }
4.4 经典实战:闰年判断
闰年判断规则
  1. 能被 4 整除,并且不能被 100 整除,是闰年

  2. 能被 400 整除,是闰年

参考代码
#include <stdio.h> ​ int main() { int year = 0; scanf("%d", &year); // 两个条件满足任意一个,就是闰年 if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { printf("是闰年\n"); } else { printf("不是闰年\n"); } return 0; }
4.5 核心重点:短路求值

逻辑运算符有一个关键特性:总是先对左侧表达式求值,再对右侧表达式求值;如果左侧表达式已经能确定整个表达式的结果,就不再对右侧表达式求值,这种现象称为短路

短路规则
  1. 逻辑与 &&:左侧表达式为假时,整个表达式结果必然为假,右侧表达式不再执行

  2. 逻辑或 ||:左侧表达式为真时,整个表达式结果必然为真,右侧表达式不再执行

代码实操:短路验证
#include <stdio.h> ​ int main() { int i = 0, a = 0, b = 2, c = 3, d = 4; // 逻辑与短路:a++结果为0(假),右侧++b、d++都不会执行 i = a++ && ++b && d++; printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d); // 输出结果:a=1,b=2,c=3,d=4 return 0; }
#include <stdio.h> ​ int main() { int i = 0, a = 0, b = 2, c = 3, d = 4; // 逻辑或短路:a++结果为0,继续执行++b,结果为3(真),右侧d++不再执行 i = a++ || ++b || d++; printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d); // 输出结果:a=1,b=3,c=3,d=4 return 0; }

❗ 易错点提醒:不要在逻辑运算符的右侧编写会改变变量值的表达式,否则短路会导致预期外的结果,出现逻辑 bug。


5. switch 语句

switch语句是 C 语言提供的另一种分支结构,专门用于条件有多个固定结果的场景,相比多重if else,代码更简洁、可读性更高。

5.1 语法格式
switch (整型表达式) { case 整型常量表达式1: 语句1; break; case 整型常量表达式2: 语句2; break; // 多个case分支... default: 默认语句; break; }
核心语法规则
  1. switch后的表达式必须是整型表达式(字符型本质是 ASCII 码,也属于整型)

  2. case后的值必须是整型常量表达式,不能是变量

  3. case和后面的数字之间必须有空格

  4. 每个case分支执行完成后,需要用break跳出 switch 语句

5.2 if 语句与 switch 语句对比

需求:输入任意整数,计算除以 3 之后的余数并打印。

if 语句实现
#include <stdio.h> ​ int main() { int n = 0; scanf("%d", &n); if(n % 3 == 0) printf("整除,余数为0\n"); else if(n % 3 == 1) printf("余数是1\n"); else printf("余数是2\n"); return 0; }
switch 语句实现
#include <stdio.h> ​ int main() { int n = 0; scanf("%d", &n); switch(n % 3) // 表达式结果为0、1、2三个固定值 { case 0: printf("整除,余数为0\n"); break; case 1: printf("余数是1\n"); break; case 2: printf("余数是2\n"); break; } return 0; }
5.3 switch 语句中的 break

break的核心作用是跳出 switch 语句,实现真正的分支效果。如果case后没有break,代码会继续向下执行,穿透到后续的case分支,直到遇到break或 switch 语句结束。

错误示例:缺少 break 导致分支穿透
#include <stdio.h> ​ int main() { int n = 7; switch(n % 3) // 7%3=1,匹配case1 { case 0: printf("整除,余数为0\n"); case 1: printf("余数是1\n"); // 执行后无break,继续向下执行 case 2: printf("余数是2\n"); // 被意外执行 } return 0; }

运行结果:同时打印余数是1余数是2,出现逻辑错误。

分支穿透的合理使用

多个 case 分支需要执行相同逻辑时,可以利用分支穿透特性,省略重复代码。

需求:输入 1~7 的数字,1~5 打印 “工作日”,6~7 打印 “休息日”,其他数字提示输入错误。

#include <stdio.h> ​ int main() { int day = 0; scanf("%d", &day); switch(day) { // 多个case共用同一套逻辑,利用分支穿透 case 1: case 2: case 3: case 4: case 5: printf("工作日\n"); break; case 6: case 7: printf("休息日\n"); break; default: printf("输入错误\n"); break; } return 0; }
5.4 switch 语句中的 default

default分支用于处理switch表达式的值无法匹配所有case的场景,相当于 if-else 中的else

  • default没有固定的位置要求,可以放在 switch 语句的任意位置,通常放在最后

  • 即使default放在最后,也建议加上break,避免后续新增 case 分支时出现穿透问题

5.5 高频易错点汇总
  1. switch后使用非整型表达式,如浮点型,会编译报错

  2. case后使用变量,必须使用整型常量表达式

  3. 遗漏break导致分支穿透,出现逻辑错误

  4. 多个case使用相同的值,会出现编译冲突

  5. 字符型 case 值使用双引号,必须使用单引号(如case 'a'


6. while 循环

循环结构用于让代码重复执行,避免冗余代码,while是 C 语言中最基础的循环语句,语法结构与 if 语句高度相似。

6.1 if 与 while 的核心区别
// if语句:条件成立,语句仅执行1次 if(表达式) 语句; ​ // while语句:条件成立,语句重复执行,直到条件不成立 while(表达式) 语句;
6.2 while 循环执行流程
  1. 执行判断表达式,值为 0,循环直接结束;值为非 0,执行循环体语句

  2. 循环体语句执行完成后,再次回到表达式判断,重复上述流程

  3. 直到表达式结果为 0,循环终止

6.3 代码实操:打印 1~10
#include <stdio.h> ​ int main() { int i = 1; // 循环变量初始化 while(i <= 10) // 循环结束条件判断 { printf("%d ", i); i = i + 1; // 循环变量调整 } return 0; }

运行结果:1 2 3 4 5 6 7 8 9 10

6.4 进阶实战:逆序打印整数的每一位

需求:输入一个正整数,逆序打印每一位,如输入 1234,输出 4 3 2 1。

#include <stdio.h> ​ int main() { int n = 0; scanf("%d", &n); while(n) // n不为0时,持续循环 { printf("%d ", n % 10); // 取最低位 n /= 10; // 去掉最低位 } return 0; }

7. for 循环

for循环是 C 语言中使用最频繁的循环语句,将循环的初始化、判断、调整三个核心部分集中在一起,代码更紧凑、维护更方便。

7.1 语法格式
for(表达式1; 表达式2; 表达式3) 语句;
  • 表达式 1:循环变量的初始化,整个循环仅执行 1 次

  • 表达式 2:循环结束条件的判断,每次循环前执行,结果为非 0 进入循环,为 0 结束循环

  • 表达式 3:循环变量的调整,每次循环体执行完后执行

7.2 for 循环执行流程
  1. 执行表达式 1,完成循环变量初始化(仅执行 1 次)

  2. 执行表达式 2,判断循环条件:结果为 0,循环结束;结果为非 0,执行循环体语句

  3. 循环体执行完成后,执行表达式 3,调整循环变量

  4. 再次回到表达式 2,重复判断、执行、调整的流程,直到表达式 2 结果为 0,循环终止

7.3 代码实操:打印 1~10
#include <stdio.h> ​ int main() { int i = 0; // 初始化、判断、调整集中在一行 for(i = 1; i <= 10; i++) { printf("%d ", i); } return 0; }
7.4 for 循环与 while 循环的对比
循环核心步骤while 循环for 循环
初始化循环外单独执行表达式 1,循环头部集中执行
条件判断循环头部表达式 2,循环头部集中执行
变量调整循环体内执行表达式 3,循环头部集中执行

核心优势:for 循环将三个核心部分集中在一起,代码量大时,可读性和可维护性远高于 while 循环,优先推荐使用 for 循环。

7.5 进阶实战:计算 1~100 之间 3 的倍数之和
#include <stdio.h> ​ int main() { int i = 0; int sum = 0; // 优化:直接生成3的倍数,省去多余的判断 for(i = 3; i <= 100; i += 3) { sum += i; } printf("1~100之间3的倍数之和:%d\n", sum); return 0; }

8. do-while 循环

do-while循环是三种循环中使用最少的,核心特性是先执行循环体,再判断循环条件,循环体至少会执行 1 次

8.1 语法格式
do { 语句; } while(表达式);

注意:while (表达式) 末尾的分号;绝对不能省略,否则会编译报错。

8.2 do-while 循环执行流程
  1. 先直接执行循环体语句

  2. 执行 while 后的判断表达式:结果为非 0,再次执行循环体;结果为 0,循环结束

8.3 代码实操:打印 1~10
#include <stdio.h> ​ int main() { int i = 1; do { printf("%d ", i); i = i + 1; } while(i <= 10); // 末尾分号不能省略 return 0; }
8.4 进阶实战:计算整数的位数

需求:输入一个正整数,计算这个数是几位数,如输入 1234,输出 4。

#include <stdio.h> ​ int main() { int n = 0; scanf("%d", &n); int cnt = 0; // 即使n=0,也是1位数,do-while完美适配 do { cnt++; n = n / 10; } while(n); printf("数字的位数:%d\n", cnt); return 0; }

适用场景:仅用于循环体至少需要执行 1 次的场景,日常开发中使用频率较低,优先使用 for/while 循环。


9. break 和 continue 语句

在循环执行过程中,需要提前终止循环或跳过本次循环时,使用breakcontinue两个关键字,二者的作用有本质区别。

关键字核心作用
break永久终止当前所在的第一层循环,直接跳出循环,执行循环后的代码
continue跳过本次循环中 continue 后面的代码,直接进入下一次循环的条件判断
9.1 while 循环中的 break 和 continue
break 示例:提前终止循环
#include <stdio.h> ​ int main() { int i = 1; while(i <= 10) { if(i == 5) break; // i等于5时,直接终止整个循环 printf("%d ", i); i++; } return 0; }

运行结果:1 2 3 4,i=5 时触发 break,循环永久终止,后续内容不再执行。

continue 示例:跳过本次循环
#include <stdio.h> ​ int main() { int i = 1; while(i <= 10) { if(i == 5) continue; // i等于5时,跳过后面的代码,直接进入下一次判断 printf("%d ", i); i++; } return 0; }

运行结果:1 2 3 4,之后程序陷入死循环。

核心原因:continue 跳过了i++,i 的值永远为 5,循环条件永远成立,陷入死循环。

9.2 for 循环中的 break 和 continue
break 示例
#include <stdio.h> ​ int main() { int i = 1; for(i = 1; i <= 10; i++) { if(i == 5) break; // 终止整个循环 printf("%d ", i); } return 0; }

运行结果:1 2 3 4,与 while 循环中行为一致。

continue 示例
#include <stdio.h> ​ int main() { int i = 1; for(i = 1; i <= 10; i++) { if(i == 5) continue; // 跳过后面的打印,直接执行i++ printf("%d ", i); } return 0; }

运行结果:1 2 3 4 6 7 8 9 10,仅跳过了 i=5 的打印,不会陷入死循环。

核心原因:for 循环中,continue 跳过循环体代码后,会直接执行表达式 3(i++)调整循环变量,不会出现 while 循环中的死循环问题。

9.3 do-while 循环中的 break 和 continue

do-while循环中的breakcontinue,行为与while循环中几乎完全一致,continue依然需要注意循环变量调整的位置,避免死循环。


10. 循环的嵌套

循环内部可以嵌套另一个循环,称为循环嵌套,用于解决更复杂的重复逻辑问题,三种循环(for/while/do-while)可以互相嵌套,最常用的是 for 循环嵌套。

经典实战:找出 100~200 之间的素数并打印

素数(质数)定义:只能被 1 和它本身整除的正整数。

解题思路
  1. 外层循环:生成 100~200 之间的所有数字

  2. 内层循环:用 2~i-1 之间的数字试除当前数字 i,判断是否能被整除

  3. 标记位:用 flag 标记是否为素数,初始假设为素数(flag=1),如果能被整除,标记为非素数(flag=0)并终止内层循环

参考代码
#include <stdio.h> ​ int main() { int i = 0; // 外层循环:遍历100~200的所有数字 for(i = 100; i <= 200; i++) { int j = 0; int flag = 1; // 标记位,假设i是素数,初始值为1 // 内层循环:判断i是否为素数 for(j = 2; j < i; j++) { if(i % j == 0) { flag = 0; // 能被整除,不是素数 break; // 提前终止内层循环,无需继续判断 } } // 标记位为1,说明是素数,打印 if(flag == 1) printf("%d ", i); } return 0; }

11. goto 语句

goto语句是 C 语言提供的跳转语法,可以在同一个函数内,跳转到设置好的标号处。

11.1 语法格式
goto 标号名; ... 标号名: 语句;
代码实操:基础跳转
#include <stdio.h> ​ int main() { printf("hehe\n"); goto next; // 跳转到next标号处 printf("haha\n"); // 被跳过,不会执行 next: printf("跳过了haha的打印\n"); return 0; }
11.2 适用场景与使用禁忌
滥用的危害

goto语句如果使用不当,会导致函数内部随意乱跳转,彻底打乱程序的执行流程,让代码可读性极差、难以维护、bug 频发,因此日常开发中,能不用就尽量不用

唯一推荐使用场景

多层循环嵌套中,需要快速跳出所有循环时,使用goto比多个break更简洁高效。

一个 break 只能跳出一层循环,3 层循环嵌套需要 3 个 break 才能跳出,而 goto 可以一次直接跳出所有循环。

for(...) { for(...) { for(...) { if(异常情况) goto error; // 一次跳出3层循环 } } } error: // 异常处理代码

✍️ 课后习题与参考答案

一、选择题
  1. 下列关于 if 语句的说法,正确的是( )

    A. if 语句只能控制一条语句,无论是否使用 {}

    B. else 总是与代码排版上对齐的 if 进行匹配

    C. if 语句的条件表达式中,0 表示假,非 0 表示真

    D. if 语句中不能嵌套另一个 if 语句

  2. 下列表达式中,能正确判断 x 是否在 [10, 20] 区间内的是( )

    A.10 <= x <= 20

    B.x >= 10 && x <= 20

    C.x >= 10 || x <= 20

    D.10 <= x && x <= 20

  3. 下列代码的运行结果是( )

    #include <stdio.h> int main() { int a = 0, b = 1; if(a++ && b++) printf("true\n"); printf("a=%d,b=%d\n", a, b); return 0; }

    A. true a=1,b=2

    B. a=1,b=1

    C. a=0,b=1

    D. true a=0,b=1

  4. switch 语句中,case 后必须跟随的是( )

    A. 变量

    B. 整型常量表达式

    C. 任意表达式

    D. 字符串

  5. 下列关于三大循环的说法,错误的是( )

    A. for 循环的初始化部分仅在循环开始时执行 1 次

    B. while 循环是先判断条件,后执行循环体

    C. do-while 循环的循环体至少会执行 1 次

    D. while 循环和 for 循环中,continue 的行为完全一致

  6. 在循环中,想要永久终止当前循环,应该使用的关键字是( )

    A. continue

    B. break

    C. goto

    D. return

二、判断题
  1. 关系运算符==和赋值运算符=可以互换使用,效果一致。( )

  2. 逻辑与&&运算符中,只要左侧表达式为假,右侧表达式就不会执行。( )

  3. switch 语句中,default 分支必须放在所有 case 分支的最后,否则会编译报错。( )

  4. for 循环的三个表达式都可以省略,写成for(;;)会形成死循环。( )

  5. continue 语句的作用是终止整个循环的执行。( )

  6. goto 语句可以在不同函数之间随意跳转。( )

三、编程题
  1. 编写程序,输入一个整数,判断它是正数、负数还是 0,使用 if-else 语句实现。

  2. 编写程序,输入一个学生的成绩(0100),输出对应的等级:90100 为 A,80~89 为 B,70~79 为 C,60~69 为 D,0~59 为 E,分别用 if-else if 和 switch 语句两种方式实现。

  3. 编写程序,计算 1~100 之间所有偶数的和,分别用 while、for、do-while 三种循环实现。

  4. 编写程序,打印 100~200 之间所有能被 3 整除且个位数字是 5 的数。

  5. 编写程序,打印九九乘法表,使用循环嵌套实现。


参考答案

一、选择题
  1. C 2. B 3. B 4. B 5. D 6. B

二、判断题
  1. ×(二者功能完全不同,==用于判断相等,=用于赋值,不可互换)

  2. √(逻辑与的短路求值特性,左侧为假,右侧不执行)

  3. ×(default 分支没有固定位置要求,可以放在 switch 语句的任意位置)

  4. √(for 循环省略三个表达式后,判断条件恒为真,形成死循环)

  5. ×(continue 仅跳过本次循环后续代码,进入下一次循环判断;break 才是终止整个循环)

  6. ×(goto 语句只能在同一个函数内跳转,不能跨函数跳转)

三、编程题

1、参考代码

#include <stdio.h> ​ int main() { int num = 0; scanf("%d", &num); if(num > 0) printf("正数\n"); else if(num < 0) printf("负数\n"); else printf("0\n"); return 0; }

2、参考代码

if-else if 实现
#include <stdio.h> ​ int main() { int score = 0; scanf("%d", &score); if(score < 0 || score > 100) { printf("输入的成绩无效\n"); } else if(score >= 90) { printf("A\n"); } else if(score >= 80) { printf("B\n"); } else if(score >= 70) { printf("C\n"); } else if(score >= 60) { printf("D\n"); } else { printf("E\n"); } return 0; }
switch 语句实现
#include <stdio.h> ​ int main() { int score = 0; scanf("%d", &score); if(score < 0 || score > 100) { printf("输入的成绩无效\n"); return 0; } // 利用整除特性,将0~100映射为0~10的固定值 switch(score / 10) { case 10: case 9: printf("A\n"); break; case 8: printf("B\n"); break; case 7: printf("C\n"); break; case 6: printf("D\n"); break; default: printf("E\n"); break; } return 0; }

3、参考代码

while 循环实现
#include <stdio.h> ​ int main() { int i = 1, sum = 0; while(i <= 100) { if(i % 2 == 0) sum += i; i++; } printf("1~100偶数和:%d\n", sum); return 0; }
for 循环实现
#include <stdio.h> ​ int main() { int i = 0, sum = 0; for(i = 2; i <= 100; i += 2) { sum += i; } printf("1~100偶数和:%d\n", sum); return 0; }
do-while 循环实现
#include <stdio.h> ​ int main() { int i = 1, sum = 0; do { if(i % 2 == 0) sum += i; i++; } while(i <= 100); printf("1~100偶数和:%d\n", sum); return 0; }

4、参考代码

#include <stdio.h> ​ int main() { int i = 0; for(i = 100; i <= 200; i++) { // 能被3整除,且个位是5 if(i % 3 == 0 && i % 10 == 5) { printf("%d ", i); } } return 0; }

5、参考代码

#include <stdio.h> ​ int main() { int i = 0, j = 0; // 外层循环控制行 for(i = 1; i <= 9; i++) { // 内层循环控制列 for(j = 1; j <= i; j++) { printf("%d*%d=%d\t", j, i, i*j); } printf("\n"); // 每行结束换行 } return 0; }

📝 本讲核心总结

本讲是 C 语言从基础语法到程序逻辑的核心转折点,我们完整覆盖了分支结构循环结构两大核心程序设计模块,核心知识点可提炼为 3 大核心:

  1. 分支结构:实现程序的选择逻辑

    • if语句适配所有分支场景,单分支、双分支、多分支嵌套均可实现,重点规避悬空 else、===混淆的坑点

    • switch语句适配多固定值的分支场景,核心是break实现分支隔离、default处理异常情况,合理利用分支穿透可简化重复代码

    • 关系操作符、逻辑操作符是分支条件的核心,重点掌握逻辑运算符的短路求值特性,避免写出有隐藏 bug 的表达式

  2. 循环结构:实现代码的重复执行

    • 三大循环各有适用场景:for循环将初始化、判断、调整集中在一起,日常开发优先使用;while循环适用于循环次数不固定的场景;do-while循环仅适用于循环体至少执行 1 次的场景

    • breakcontinue是循环控制的核心:break永久终止循环,continue跳过本次循环后续代码,重点区分二者在whilefor循环中的行为差异

    • 循环嵌套是复杂逻辑的实现基础,核心是理清外层循环与内层循环的职责,避免嵌套层级过多导致代码可读性下降

  3. 结构化程序设计思想

    C 语言的三大程序结构(顺序、分支、循环),可以拆解和实现现实中所有的业务逻辑。本讲的所有语法,最终目标都是让你写出逻辑清晰、结构合理、可维护的代码,而非单纯的语法记忆。后续的函数、数组、指针等知识点,都将基于这三大结构展开,务必吃透本讲内容,多动手写代码练习,形成肌肉记忆。

本系列笔记持续更新,下一讲将通过经典的「猜数字游戏」实战,带你落地分支与循环的综合应用,完成从语法到项目的跨越~


📌 版权说明

本文为个人学习笔记整理,配套课程课件内容,未经允许禁止转载,如有错误欢迎评论区指正~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/24 8:38:48

装卸料小车:6个位置运行控制,三菱PLC与组态王6.55联机程序T108

装卸料小车6个位置 运行控制三菱PLC和组态王6.55 联机程序T108装卸料小车的多点位控制在工业现场很常见。六个工位往返控制看起来简单&#xff0c;但实际调试时总会遇到PLC和上位机组态王联机的奇葩问题。今天拆解个经典案例&#xff1a;用三菱FX3U PLC和组态王6.55实现的六工位…

作者头像 李华
网站建设 2026/5/23 1:37:05

好用的系统集成项目管理软件有什么特征?

对于系统集成企业而言&#xff0c;项目管理的核心痛点的是“复杂场景全覆盖、业务流程能落地、成本进度可管控”——不同于普通IT项目&#xff0c;系统集成项目牵扯主合同与内控管理、物资采购与库存、分包与人力成本、变更与归档等多个环节&#xff0c;稍有疏漏就会出现成本超…

作者头像 李华
网站建设 2026/5/23 1:37:06

无损音视频剪辑工具,支持多种格式,快速精准裁剪音视频文件,保留原始画质与音质批量剪辑软件

大家好&#xff0c;我是大飞哥。在日常音视频处理过程中&#xff0c;很多用户都会面临剪辑画质受损、格式不兼容、操作复杂耗时、批量处理困难等问题&#xff0c;普通剪辑工具要么压缩严重导致音画质量下降&#xff0c;要么功能繁琐上手门槛高&#xff0c;要么处理速度缓慢影响…

作者头像 李华
网站建设 2026/5/23 1:37:05

基于 LRU 的流表老化:工程实践

业务背景 报文按五元组&#xff08;源/目的 IP、源/目的端口、VPN 等&#xff09;识别业务&#xff0c;并为每条业务维护一个流对象。不同协议通常分表存放&#xff08;如 TCP、UDP、ICMP&#xff09;。idle 时间可按协议区分&#xff1a;本文约定 TCP、UDP 为 3 分钟&#xff…

作者头像 李华
网站建设 2026/5/23 1:37:07

TLV1117-33IDCYR 低压差线性稳压器(LDO) TI德州仪器

TLV1117-33IDCYR 是德州仪器&#xff08;Texas Instruments&#xff09;推出的一款3.3V 固定输出、800mA 低压差线性稳压器&#xff08;LDO&#xff09;&#xff0c;采用业界通用的 SOT-223&#xff08;TO-261-4&#xff09;封装。凭借 1.2V 的极低压差、0.2% 的线路调整率、75…

作者头像 李华