内容正文:
山东省计算机类高考技能教学
if与switch的分支结构设计
一、教学目标
【知识目标】
1.理解程序设计中分支结构的概念和作用以及关系表达式与逻辑表达式
2.掌握if语句的三种语法形式(单分支/双分支/多分支)
3.掌握switch语句的语法结构及break、continue关键字的区别与作用
4.理解if与switch结构的适用场景区别
【能力目标】
能够正确使用if语句实现条件判断
能够正确使用switch处理多路分支问题
能将实际应用场景转化为分支结构程序
【素养目标】
培养严谨的逻辑思维能力
形成规范的代码编写习惯
增强解决实际问题的信心
二、基本知识讲解
分支结构的概念
在 C 语言中,分支结构(选择结构)是一种根据条件判断结果来决定执行不同代码路径的逻辑结构,类似于现实中的 “十字路口”,让程序能根据不同情况做出选择。
类比生活场景:
"如果今天下雨,就带伞;否则不带伞" → 这就是典型的分支逻辑
关系表达式与逻辑表达式
关系表达式:比较大小与条件判断
定义:通过关系运算符比较两个操作数的大小关系,结果为逻辑值(真或假)。
在 C 语言中,逻辑值用整数表示:
真:非 0 值(如 1、5、-3 等)
假:0
关系运算符列表
运算符
含义
示例
结果解释
>
大于
5 > 3
真(1)
<
小于
2 < 8
真(1)
>=
大于等于
5 >= 5
真(1)
<=
小于等于
3 <= 1
假(0)
==
等于
4 == 2
假(0)
!=
不等于
5 != 3
真(1)
注意:
· ==(等于) vs =(赋值):
a == 5 是判断 a 是否等于 5(关系运算);
a = 5 是将 5 赋值给 a(赋值运算)。
常见错误:误将 if (a == 0) 写成 if (a = 0),导致逻辑错误。
关系表达式的运算规则
· 表达式格式:
操作数1 关系运算符 操作数2
例:x > y、a + b <= c - d、ch != 'A'。
· 结果类型:整数(0 或 1)
int a = 3, b = 5;
printf("%d
", a > b); // 输出0(假)
printf("%d
", a != b); // 输出1(真)
· 优先级:
高于赋值运算符(=),低于算术运算符。
例:3 + 2 > 4 等价于 (3+2) > 4,结果为 1(真)。
· 结合性:从左到右
int x = 10;
x > 5 > 3 // 等价于 (10>5)>3 → 1>3 → 0(假)
逻辑表达式:组合多个条件
定义:
通过逻辑运算符将多个关系表达式或逻辑值组合起来,形成更复杂的条件判断。
结果仍为逻辑值(0 或 1)。
运算符
名称
符号
功能描述
&&
逻辑与
双目
当左右两边操作数都为真时,结果为真;否则为假。
||
逻辑或
双目
当左右两边操作数至少一个为真时,结果为真;否则为假。
!
逻辑非
单目
对操作数取反:若操作数为真,结果为假;若为假,结果为真。
逻辑运算符的运算规则
1. 逻辑与(&&)
规则:仅当左操作数和右操作数都为真时,结果为真(1),否则为假(0)。
真值表:
左操作数A
右操作数B
A && B
真(非 0)
真(非 0)
真(1)
真(非 0)
假(0)
假(0)
假(0)
真(非 0)
假(0)
假(0)
假(0)
假(0)
示例:
int a = 5, b = 3, c = 0;
printf("%d
", a > 0 && b < 5); // 5>0为真,3<5为真 → 结果1(真)
printf("%d
", a > 10 && b < 2); // 5>10为假,直接短路,结果0(假)
2.逻辑或(||)
规则:当左操作数或右操作数至少一个为真时,结果为真(1),否则为假(0)。
真值表:
左操作数A
右操作数B
A || B
真(非 0)
真(非 0)
真(1)
真(非 0)
假(0)
真(1)
假(0)
真(非 0)
真(1)
假(0)
假(0)
假(0)
示例:
int a = 5, b = 3, c = 0;
printf("%d
", a < 0 || b > 2); // 5<0为假,3>2为真 → 结果1(真)
printf("%d
", a > 0 || c++ > 5); // a>0为真,直接短路,c不参与运算 → 结果1(真)
3. 逻辑非(!)
规则:对操作数的真假取反:若操作数为真(非 0),结果为假(0);若为假(0),结果为真(1)。
示例:
int a = 5, b = 0;
printf("%d
", !a); // 5为真 → 取反后0(假)
printf("%d
", !b); // 0为假 → 取反后1(真)
逻辑运算符的关键特性
· 短路求值(重要!)
逻辑与(&&):若左操作数为假,右操作数不会执行(因为结果已确定为假)。
int x = 1, y = 2;
(x == 0) && (y++ > 0); // x==0为假,y++不执行,y仍为2
逻辑或(||):若左操作数为真,右操作数不会执行(因为结果已确定为真)。
int x = 1, y = 2;
(x == 1) || (y++ > 0); // x==1为真,y++不执行,y仍为2
· 运算符优先级
!(逻辑非)优先级最高,高于算术运算符和关系运算符。
例:!a == b 等价于 (!a) == b。
&& 的优先级高于 ||,但低于关系运算符。
例:a > b && c < d || e == f 等价于 (a > b && c < d) || (e == f)。
建议用括号明确运算顺序,避免错误。
· 注意事项
逻辑值与数值的转换:
在 C 语言中,非 0 值视为真(逻辑结果为1),0 值视为假(逻辑结果为0)。
例:int a = 3; if (a) { ... } 等价于 if (a != 0)。
区分逻辑运算符与位运算符:
&& 和 || 是逻辑运算符,用于判断真假;
& 和 | 是位运算符,用于二进制位运算;
if语句的三种语法形式
单分支if语句
if (条件表达式) {
// 条件为真(非0)时执行的代码块
}
执行逻辑:先计算条件表达式的值,若为真(非 0),则执行大括号内的代码;若为假(0),则跳过代码块。
关键点说明
· 条件表达式:可以是关系表达式(如a > b)、逻辑表达式(如x && y)或数值(非 0 即真)。
· 代码块规范:若代码块仅含一条语句,大括号可省略(但建议保留,避免漏写)。
// 规范写法(推荐)
if (score >= 60) {
printf("及格!");
}
// 省略大括号的写法(仅一条语句时允许)
if (temperature < 0) printf("结冰警告!");
双分支if-else语句
if (条件表达式) {
// 条件为真时执行的代码块
} else {
// 条件为假时执行的代码块
}
执行逻辑:若条件为真,执行if代码块;否则,执行else代码块(二者必选其一)。
适用场景:二选一的场景(如:判断性别、区分奇偶)。
关键点说明
· else的位置:必须紧跟在if代码块之后,中间不能插入其他语句。
· 避免逻辑错误:条件表达式需覆盖所有可能情况(如:判断奇偶时,num%2==1为真则奇数,否则偶数)。
多分支if-else if-else语句
语法格式:
if (条件1) {
// 条件1为真时执行
} else if (条件2) {
// 条件1为假且条件2为真时执行
} else if (条件3) {
// 条件1、2为假且条件3为真时执行
}
...
else {
// 以上所有条件都为假时执行(可选)
}
执行逻辑:按顺序判断条件,一旦某个条件为真,执行对应代码块,后续条件不再判断;若所有条件为假,执行else代码块(若无else,则不执行任何分支)。
适用场景:多条件分级处理(如:成绩等级、商品折扣、季节判断)。
关键点说明
· 条件顺序:优先判断范围小或优先级高的条件(如:判断成绩等级时,先判断>=90再判断>=80)。
· 避免冗余判断:后续条件无需重复前序条件的相反情况(如:else if隐含 “前序条件为假”)。
语法形式
关键词
逻辑本质
典型场景
注意事项
单分支if
if
条件为真则执行
单一触发(如:报警)
代码块规范,避免漏写大括号
双分支if-else
if-else
二选一
对立判断(如:正负)
else不能单独使用,条件覆盖全量
多分支if-else if-else
if-else if-else
按顺序多层判断
分级处理(如:等级、折扣)
条件顺序优先级,避免逻辑漏洞
switch 语句的语法结构
基本语法格式:
switch (表达式) {
case 常量表达式1:
语句块1;
[break;] // 可选,用于跳出switch结构
case 常量表达式2:
语句块2;
[break;]
...
default: // 可选,处理所有case都不匹配的情况
语句块n;
[break;]
}
关键规则
· 表达式类型:通常为整数类型(如int、char)或枚举类型,不能是浮点数或变量。
常量表达式:
· 每个case后的常量表达式必须是唯一的(不能重复)。
· 常量表达式的值必须与switch表达式的类型兼容(如int类型表达式对应case 1、case 'a'等)。
执行流程:
①计算switch表达式的值。
②按顺序匹配case后的常量表达式,找到匹配项后执行对应语句块。
③若未遇到break,会继续执行后续所有case的语句块,直到switch结束或遇到break。
④若所有case都不匹配,执行default(若存在)。
break 关键字的作用
1. 作用
· 跳出当前 switch 结构:当执行到break时,立即终止switch语句的执行,跳转到switch后的下一条语句。
· 避免穿透效应:若没有break,程序会从匹配的case开始,依次执行后续所有case和default的语句块(即使不匹配),这种现象称为 “穿透”。
示例(有 break)
int num = 2;
switch (num) {
case 1:
printf("One
");
break; // 跳出switch
case 2:
printf("Two
"); // 匹配,执行后跳出
break;
default:
printf("Other
");
}
// 输出:Two
示例(无 break,穿透现象)
int num = 2;
switch (num) {
case 1:
printf("One
");
case 2:
printf("Two
"); // 匹配,继续执行下一个case
case 3:
printf("Three
"); // 无break,继续执行
default:
printf("Other
");
}
// 输出:Two
Three
Other
continue 关键字的作用
1. continue 的作用
· 跳过本次循环的剩余语句:仅用于循环结构(如for、while、do-while),而非switch语句。
· 继续下一次循环:执行continue后,程序会立即跳转到循环条件判断处,开始下一次循环。
break 与 continue 的核心区别
关键字
适用场景
作用
break
循环或 switch 结构
终止当前结构(循环或 switch)的执行。
continue
仅循环结构
跳过本次循环的剩余语句,继续下一次循环。
switch 语句中误用 continue 的情况
错误示例(编译会报错):
switch (num) {
case 1:
continue; // 错误!continue不能用于switch
// ...
}
if和switch结构的适用场景对比
维度
if语句
switch语句
条件类型
任意表达式(逻辑 / 关系 / 函数返回值等)
仅整数类型(int、char、枚举等)
分支逻辑
适合范围判断或复杂组合条件(如a>10 && b<20)
适合离散值的等值判断(如case 1、case 'A')
代码结构
灵活但分支多易冗长(if-else链)
结构清晰,适合多分支离散值映射
典型场景
成绩等级、温度区间、非整数判断(如浮点数)
枚举值处理、月份 / 星期判断、命令码映射
三、例题讲解
例题 1:分段函数计算
f(x) = x² (x < 0)
f(x) = x+1 (0 ≤ x < 10)
f(x) = (x ≥ 10)
输入:一个实数 x
输出:f (x) 的值(保留 2 位小数)
#include <stdio.h>
#include <math.h>
int main() {
double x, result;
scanf("%lf", &x);
if (x < 0) {
result = x * x;
} else if (x < 10) { // 隐含 x >= 0
result = x + 1;
} else { // x >= 10
result = sqrt(x);
}
printf("f(%.2lf) = %.2lf
", x, result);
return 0;
}
例题2:输入一个整数(1-7),输出对应的星期几,并判断是工作日还是休息日。
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
switch (n) {
case 1: printf("星期一
"); break;
case 2: printf("星期二
"); break;
case 3: printf("星期三
"); break;
case 4: printf("星期四
"); break;
case 5: printf("星期五
"); break;
case 6: printf("星期六
"); break;
case 7: printf("星期日
"); break;
default: printf("输入错误
"); return 1;
}
switch (n) {
case 1: case 2: case 3: case 4: case 5: // 穿透处理
printf("工作日
");
break;
case 6: case 7:
printf("休息日
");
break;
}
return 0;
}
例题3:实现一个简单计算器,支持四则运算(+、-、、/)。
输入:两个整数 a、b 和一个运算符 op(+、-、、/)
输出:计算结果(除法保留 2 位小数,除数为 0 时输出错误)
#include <stdio.h>
int main() {
int a, b;
char op;
scanf("%d %c %d", &a, &b);
// 前置条件检查(用if)
if (op == '/' && b == 0) {
printf("错误:除数不能为0
");
return 1;
}
// 核心运算逻辑(用switch)
switch (op) {
case '+':
printf("%d + %d = %d
", a, b, a + b);
break;
case '-':
printf("%d - %d = %d
", a, b, a - b);
break;
case '*':
printf("%d * %d = %d
", a, b, a * b);
break;
case '/':
printf("%d / %d = %.2lf
", a, b, (double)a / b);
break;
default:
printf("错误:不支持的运算符
");
return 1;
}
return 0;
}
四、课堂小结
if 语句常见错误:
混淆==(等于)和=(赋值)
漏写大括号(尤其代码块包含多条语句时)
条件范围重叠或未覆盖所有情况(如判断成绩等级时顺序错误)
switch 语句常见错误:
case 后使用变量或表达式(如case score > 90:)
漏写 break 导致穿透效应(如 case 1 执行后继续执行 case 2)
default 分支缺失(可能导致未预期情况无处理逻辑)
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$$