一、前置核心概念
语句:分号;结尾的代码单元;代码块(复合语句):{ }包裹,逻辑上视为一条语句,分支 / 循环后多条代码必须加大括号;逻辑真假:C 语言没有布尔类型,0代表假,非 0 任意数字都代表真。
第一部分:分支语句(选择结构)
1. if 分支
1.1 单 if
语法:
c
运行
if(表达式) 语句; // 只有一条可省略{}执行逻辑:表达式结果非 0 → 执行内部代码,否则跳过。 易错坑:不加{}时,if 仅控制紧跟的第一条语句。
c
运行
// 错误示范 if(1>0) printf("1"); printf("2"); // 这条永远执行,不受if控制 // 正确多语句写法 if(1>0){ printf("1"); printf("2"); }1.2 if else 二选一
c
运行
if(表达式) 语句1; else 语句2;互斥:表达式为真执行 if,假执行 else,只能走一条。
1.3 if else if 多分支(互斥判断)
c
运行
if(a < 60){ printf("不及格"); }else if(a < 80){ printf("中等"); }else if(a < 90){ printf("良好"); }else{ printf("优秀"); }执行规则:从上到下依次判断,找到第一个成立条件直接执行,剩余分支全部跳过。
1.4 悬空 else(高频易错难点)
else 永远匹配离它最近、未配对的 if,和缩进无关!
c
运行
int a=0, b=1; if(a == 1) if(b == 1) printf("yes"); else printf("no");肉眼看 else 想匹配外层 if,实际匹配内层 if; 解决:用大括号明确划分代码块。
2. switch 分支(整型多条件匹配)
基础语法
c
运行
switch(整型表达式){ // 只能int/char/short,不能浮点、字符串 case 常量1: 语句; break; // 跳出switch case 常量2: 语句; break; default: // 所有case都不匹配才执行 语句; }关键特性 1:穿透性(无 break 会顺序执行后续 case)
c
运行
int n=2; switch(n){ case 1: printf("1"); case 2: printf("2"); case 3: printf("3"); } // 输出:23适用场景:多条件执行同一套逻辑,利用穿透简化代码。
关键特性 2:case 必须是常量,不能放变量
c
运行
int x=5; case x: // 编译报错!case后只能写数字、字符常量关键特性 3:default 位置任意
default 可以写在最前面、中间、最后,不影响逻辑,习惯放末尾。
3. 三目运算符(极简分支)
条件 ? 表达式1 : 表达式2逻辑:条件为真执行 1,否则执行 2,有返回值
c
运行
int max = a > b ? a : b;等价于:
c
运行
int max; if(a>b) max=a; else max=b;第二部分:循环语句(重复结构)
循环四要素:初始化、循环条件、循环体、更新变量
1. while 循环(先判断,后执行,可能一次都不跑)
语法:
c
运行
while(判断表达式) { 循环体; 更新变量; }执行流程:
- 计算表达式;
- 真 → 执行循环体,回到步骤 1;
- 假 → 直接跳出循环。
示例:打印 1~10
c
运行
int i=1; while(i<=10){ printf("%d ",i); i++; // 必须更新,否则死循环 }坑:忘记更新循环变量,条件永久成立 → 死循环。
2. do while 循环(先执行,后判断,至少执行 1 次)
语法:
c
运行
do{ 循环体; 更新变量; }while(表达式); // 末尾分号不能丢!区别 while:无论条件真假,循环体一定会先跑一遍。 适用场景:菜单输入、至少执行一次交互逻辑。
3. for 循环(结构最清晰,分三段)
c
运行
for(初始化; 判断条件; 更新表达式) { 循环体; }执行顺序(固定不变):
- 初始化(仅执行 1 次)
- 判断条件
- 假:循环结束
- 真:执行循环体 → 执行更新表达式 → 回到步骤 2
三段全部可省略
c
运行
for(;;) // 等价while(1),无限死循环for 循环优势
初始化、更新集中写在一行,适合已知循环次数场景;
c
运行
// 打印1~10,标准写法 for(int i=1; i<=10; i++){ printf("%d ",i); }第三部分:循环控制关键字 break /continue
1. break
- switch 中:跳出 switch 分支;
- 循环中:直接终止当前整个循环,跳到循环外代码。
c
运行
for(int i=1;i<=10;i++){ if(i==5) break; printf("%d ",i); } // 输出:1 2 3 42. continue
仅终止本次循环,直接进入下一次判断,不跳出整体循环。
c
运行
for(int i=1;i<=5;i++){ if(i==3) continue; printf("%d ",i); } // 输出:1 2 4 5 // i=3时跳过打印,直接i++进入下一轮第四部分:嵌套分支 + 嵌套循环深度理解
1. 分支嵌套
if 内部套 if、switch 套 if 都合法,核心依靠{}划分层级,解决悬空 else 问题。
2. 循环嵌套(多层循环)
break/continue仅控制自身所在的一层循环,不影响外层。 例:九九乘法表(外层行,内层列)
c
运行
for(int i=1;i<=9;i++){ for(int j=1;j<=i;j++){ printf("%d*%d=%d ",j,i,i*j); } printf("\n"); }跳出多层循环方案:标记 goto(C 语言唯一推荐使用场景)
c
运行
for(int i=1;i<10;i++){ for(int j=1;j<10;j++){ if(i*j == 30) goto end_loop; // 直接跳到标记处 } } end_loop: ; // 标记第五部分:高频底层易错点
1. 判断表达式常见错误
(1)赋值=和等于==混淆
c
运行
if(a=5) // 永远为真,等价if(5) if(a==5) // 判断a是否等于5(2)浮点数不能直接 == 判断
浮点存储有精度误差,不能写if(f == 1.0),改用差值极小范围判断。
2. 死循环产生场景
- while/for 忘记更新循环变量;
while(1)/for(;;)无限循环;- 条件永远为真:
while(i>0)且 i 只递增。
3. 分号陷阱
c
运行
// 循环后多了分号,循环体为空语句,后面代码脱离循环 for(int i=0;i<5;i++); { printf("test"); // 只执行一次 } // do while 末尾必须带分号,丢失会编译报错 do{}while(i<10);第六部分:三大循环使用场景总结
- for:循环次数明确(遍历数组、固定次数打印);
- while:循环次数未知,先判断再执行(读取文件直到末尾);
- do while:必须先执行一次(用户输入菜单,至少展示一次界面)。
第七部分:综合实战例题(巩固)
例题 1:分支判断成绩等级
c
运行
#include <stdio.h> int main() { int score; scanf("%d", &score); if(score < 0 || score > 100){ printf("成绩非法"); }else if(score < 60){ printf("不及格"); }else if(score < 80){ printf("中等"); }else if(score < 90){ printf("良好"); }else{ printf("优秀"); } return 0; }例题 2:循环求 1~100 偶数和
c
运行
#include <stdio.h> int main() { int sum=0; for(int i=1;i<=100;i++){ if(i%2 != 0) continue; // 奇数跳过 sum += i; } printf("%d", sum); return 0; }例题 3:菜单 do-while 循环
c
运行
#include <stdio.h> int main() { int op; do{ printf("1.功能1 2.功能2 0.退出\n"); scanf("%d", &op); switch(op){ case 1: printf("执行功能1\n"); break; case 2: printf("执行功能2\n"); break; case 0: printf("退出程序\n"); break; default: printf("输入错误\n"); } }while(op != 0); return 0; }