内容正文:
专题四 分支和跳转(讲义)
---《编程语言基础—C语言》专题复习讲练测
[考纲要求]
1:理解关系表达式和逻辑表达式。
2:掌握条件语句(if语句)和多分支语句(switch语句)的用法。
[课时安排]
2课时
[知识梳理]
一:关系表达式和逻辑表达式
· 关系表达式
在C语言中,关系表达式用于比较两个值之间的关系,并根据比较结果返回一个布尔值,即1(真)或0(假)。
关系表达式如下图所示:
操作符
符号
描述
返回值(真/假)
等于
==
检查两边是否相等
相等返回1(真)
不等于
!=
检查两边是否不相等
不等返回1(真)
大于
>
检查左边是否大于右边
大于返回1(真)
小于
<
检查左边是否小于右边
小于返回1(真)
大于等于
>=
检查左边是否大于或等于右边
大于等于返回1(真)
小于等于
<=
检查左边是否小于或等于右边
小于等于返回1(真)
① 等于 (==):检查两个操作数是否相等。
例如:5 == 5 返回 1(真),因为两边的值相等。
② 不等于 (!=):检查两个操作数是否不相等。
例如:5 != 3 返回 1(真),因为两边的值不相等。
③ 大于 (>):检查左边的操作数是否大于右边的操作数。
例如:10 > 5 返回 1(真),因为左边的值大于右边的值。
④ 小于 (<):检查左边的操作数是否小于右边的操作数。
例如:5 < 10 返回 1(真),因为左边的值小于右边的值。
⑤ 大于等于 (>=):检查左边的操作数是否大于或等于右边的操作数。
例如:10 >= 5 返回 1(真),因为左边的值大于或等于右边的值。
⑥ 小于等于 (<=):检查左边的操作数是否小于或等于右边的操作数。
例如:5 <= 10 返回 1(真),因为左边的值小于或等于右边的值。
关系表达式通常用于控制流语句(如if语句)中,以决定程序的执行流程。
int a = 5;
int b = 10;
if (a < b) {
// 如果a小于b,则执行这里的代码
printf("a is less than b
");
}
a < b是一个关系表达式,如果a的值小于b的值,表达式的结果是1(真),if语句中的代码块将被执行。如果a的值不小于b,表达式的结果是0(假),代码块将被跳过。
· 逻辑表达式
C语言中的逻辑表达式用于组合多个关系表达式或逻辑值,并返回一个布尔值(1 表示真,0 表示假)。逻辑表达式如下图所示:
操作符
符号
描述
示例
返回值(真/假)
逻辑与
&&
当两个操作数都为真时,结果为真
(5 > 3) && (10 < 20)
真(1)
逻辑或
||
当两个操作数只要有一个操作数为真时,结果为真
(2>3)||(5<9)
如果至少有一个操作数为真,则结果为真
逻辑非
!
反转操作数的真假值
!(5 == 3)
真(1)
① 逻辑与 (&&):当两个操作数都为真时,结果为真。
例如:(5 > 3) && (10 < 20) 返回 1(真),因为两个条件都为真。
② 逻辑或 (||):如果至少有一个操作数为真,则结果为真。
例如:(5 > 3) || (10 > 20) 返回 1(真),因为第一个条件为真。
③ 逻辑非 (!):反转操作数的真假值。如果操作数为真,则结果为假;如果操作数为假,则结果为真。
例如:!(5 == 3) 返回 1(真),因为 5 == 3 为假。
二:条件语句(if语句)
(1)if语句
C语言的基本if语句是控制流语句中的一种,用于基于条件执行代码。
· 基本语法
if语句的基本语法如下:
if (条件表达式) {
// 条件为真时执行的代码块
}
在C语言中,非零值通常被解释为真值(true)。这意味着任何非零的数值(包括正数和负数)在布尔上下文中都被视为真。相反,零值(0)被解释为假值(false)。
当if语句的条件表达式计算结果为非零值时,条件被认为是真的,花括号内的代码块将被执行。如果结果为零,则条件被认为是假的,代码块将被跳过。
· 条件表达式
条件表达式可以是任何返回布尔值的表达式,例如:
①:比较运算符:==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)
②:逻辑运算符:&&(逻辑与)、||(逻辑或)、!(逻辑非)
③:位运算符:&(位与)、|(位或)、^(位异或)、~(位非)
④:其他表达式,如函数调用等
· 举例:
int x = 5;
if (x > 3) {
printf("x is greater than 3
");
}
在这个例子中,如果x的值大于3,将打印出相应的消息。
· 复合语句
if语句可以包含多个语句,这些语句需要用花括号{}包围:
if (x > y) {
printf("x");
x = x - 1; // 将x的值减1
}
(2)if...else语句
C语言中的if...else语句是一种基本的控制流结构,它允许程序根据条件的真假来选择执行两个不同的代码块。
· 基本语法
if (条件表达式) {
// 条件为真时执行的代码块
} else {
// 条件为假时执行的代码块
}
当if...else语句被执行时,程序会首先计算条件表达式的值:
如果condition的值为真(非零),则执行if语句块中的代码。
如果condition的值为假(零),则跳过if语句块中的代码,执行else部分的代码。
int x = 10;
int y = 5;
if (x > y) {
printf("x 大于 y
");
}
else {
printf("x 不大于 y
");
}
因为x的值(10)大于y的值(5),所以会执行if语句块中的代码,打印出"x 大于 y"。
(3)if语句嵌套
C语言中的if语句可以嵌套使用,即在一个if语句块内部再使用一个或多个if语句。这种嵌套可以用于创建复杂的条件逻辑,根据不同的条件执行不同的代码块。
· 基本语法
if (条件表达式1) {
// 条件1为真时执行的代码块
if (条件表达式2) {
// 条件1和条件2都为真时执行的代码块
} else {
// 条件1为真,但条件2为假时执行的代码块
}
} else {
// 条件1为假时执行的代码块
}
· 示例
1. int x = 10;
2. int y = 5;
3. int z = 3;
4.
5. if (x > y) {
6. printf("x 大于 y
");
7. if (y > z) {
8. printf(" y 大于 z
");
9. }
10. } else {
11. printf("x 不大于 y
");
12. }
首先检查x是否大于y,如果是,程序进入第一个if语句块,并打印"x 大于 y"。然后,程序进一步检查y是否大于z,如果是,执行第二个if语句块,并打印" y 大于 z"。
(4)条件表达式
C语言中的条件表达式,通常称为三元运算符,它是一种简洁的条件选择语句。
· 基本语法
1. 表达式1 ?表达式2 : 表达式3
①:表达式1:条件表达式,它是一个逻辑表达式,结果为真(非零)或假(零)。
②:表达式2:如果条件表达式(表达式1)的结果为真,则执行这个表达式。
③:表达式3:如果条件表达式(表达式1)的结果为假,则执行这个表达式。
举例:
1. #include <stdio.h>
2.
3. int main() {
4. int a = 10;
5. int b = 20;
6. int max = (a > b) ? a : b;
7. printf("最大值是 %d
", max);
8. return 0;
9. }
在这个例子中,a > b 的结果是假(因为 10 不大于 20),所以表达式 (a > b) ? a : b 的结果是 b,即20。
· 注意事项
① 条件表达式可以嵌套使用。
② 条件表达式通常用于简单的条件选择,如果条件逻辑较为复杂,建议使用 if-else 语句。
· 扩展:条件运算符的扩展形式
C99标准引入了条件运算符的扩展形式,允许在条件表达式中包含更多的逻辑运算符,例如:
表达式1 ? 表达式2 : (表达式3 ? 表达式4 : 表达式5)
如果 表达式1 为真,则结果为 表达式2;如果 表达式1 为假,则再次进行条件判断,表达式3 为真则结果为 表达式4,否则结果为 表达式5。
三:switch语句
C语言中的switch语句是一种多路选择语句,它允许程序根据变量或表达式的值来选择执行多个代码块中的一个。
· 基本语法
1. switch (expression) {
2. case constant_expression1:
3. // 代码块1
4. break;
5. case constant_expression2:
6. // 代码块2
7. break;
8. ...
9. default:
10. // 默认代码块(可选)
11. break;
12. }
基本标签:
· 表达式(expression):switch语句中的表达式可以是任何整型或字符型表达式。这个表达式的结果将与case标签中的常量表达式进行比较。
· case标签(constant_expression):case后面跟着的是一个常量表达式,它必须是一个整型或字符型表达式。switch语句会从上到下检查每个case,直到找到与表达式结果匹配的case。
· 代码块:每个case后面跟着的是一个或多个要执行的语句。如果case匹配,就会执行该case下的所有语句,直到遇到break语句。
· break语句:break语句用于终止switch语句的执行,防止执行流程继续滑落到下一个case。如果没有break,程序会继续执行下一个case的代码块。
· default标签:default是一个可选的标签,它在没有匹配的case时被执行。default可以出现在switch语句的任何位置,但通常放在最后。
举例:
1. #include <stdio.h>
2.
3. int main() {
4. int month = 4;
5. switch (month) {
6. case 1:
7. printf("January");
8. break;
9. case 2:
10. printf("February");
11. break;
12. case 3:
13. printf("March");
14. break;
15. case 4:
16. printf("April");
17. break;
18. default:
19. printf("Invalid month");
20. }
21. return 0;
22. }
在这个例子中,month变量的值为4,switch语句会匹配到case 4,并打印出"April"。
· 注意事项
①:switch语句中的expression和case标签的常量表达式都必须是整型或字符类型。
②:如果case后没有break,程序会继续执行下一个case的代码块,即使它们不匹配。
③:default可以省略,如果省略,且没有匹配的case,switch语句将不做任何操作。
④:switch语句可以嵌套使用。
[真题练讲]
1.(2020职教高考题)以下程序段的运行结果是( )
int a = 1,b = 0L,t;
t = (a>b)||++a&&b++;
printf(“%d,%d,%d
”,t,a,b);
A.0,2,0 B.0,2,1
C.1,1,0 D.1,2
【答案】C
【解析】初始时,a的值为1,b的值为0L。(a > b) 为真,因为1大于0。由于||运算符的短路特性,表达式(a > b) || (++a && b++)在此处停止计算,++a和b++不会被执行。
因此,t被赋值为1,a的值保持为1,b的值保持为0L。所以,表达式printf("%d,%d,%d
", t, a, b);的输出将是1,1,0。
2.(2018职教高考题)以下程序段的运行结果是( )
int x,y,z,d;
x = 2;y = 3;z = 5;
d = z > y > x && ++y;
printf(“%d,%d
”,d,y);
A.0,4 B.1,4
C.0,3 D.1,3
【答案】C
【解析】x初始化为2,y初始化为3,z初始化为5。表达式z > y的结果是假(因为5不大于3)。由于关系运算符>的结果是假(0),它会被隐式地转换为整数0。然后0 > x进行比较,x的值是2,所以表达式0 > x的结果是假。由于&&运算符要求两边都为真整个表达式才为真,这里左边已经是假,所以&& ++y不会执行(短路求值)。因此,d被赋值为0,y的值保持为3不变。所以,printf("%d,%d
", d, y);的输出将是0,3。
3.(2019年职教高考题)以下程序段的运行结果是( )
char a = ‘t’;
a = (a>=’a’&& a<’z’)?(a - ‘a’+’A’):a;
printf(“%c
”,a);
A.t B.T
C.a D.A
【答案】B
【解析】首先检查a是否大于等于'a'并且小于'z'。在这个例子中,'t'确实在这个范围内。
如果条件为真,执行表达式(a - 'a' + 'A')。这里的操作是将a从'a'开始的ASCII值减去,然后加上'A'的ASCII值,从而将小写字母转换为大写字母。由于't'在ASCII表中对应的值是116,'a'的ASCII值是97,'T'的ASCII值是84。计算(116 - 97) + 65得到84,即'T'的ASCII值。因此,a的值被更新为'T'。最后,printf函数打印出a的值,即大写的'T'。
4.(2020年职教高考题)若x、y、w均是int型变量,以下正确的switch 语句是( )
A.switch x
{ case 10:w=x+y;break;
case 11:w=y-x;break;
default;w=x*y; }
B.switch(x+y)
{ case 11:w=y-x,break;
case 10:w=x+y;break;
default:w=x*y;) }
C.switch(x*y)
{ case 1:w=x十y;
case 2:w=y-x;break;
case 1+1:w=x*y;break;}
D.switch(x)
{ case x:w=x十y;break;
case y:w=y-x;break;
default;w=x*y; }
【答案】B
【解析】A选项:switch后面应该是一个括号包围的表达式,而不是单个变量。C选项:标号有重复,如2和1+1。D选项:标号不应该是变量。
5.(2020年职教高考题)若有定义语句char ch='0',则表达式ch++? -5%-2:ch>'a'?5%-2:-5/2的值为( )
A.-2 B.-1 C.1 D.2
【答案】B
【解析】ch++:这是一个后缀递增运算符,意味着ch的值在使用后会增加1。但在这个表达式的上下文中,由于ch++作为条件表达式的一部分,其值在比较时仍然是原始值48。-5 % -2:这是求模运算,-5除以-2的余数是1。ch > 'a':由于ch的初始值是48,而'a'的ASCII码值是97,所以这个条件是假。5 % -2:这是求模运算,5除以-2的余数是1。-5 / 2:这是整数除法,-5除以2的结果是-2。代入原始表达式:由于ch++(即48)不等于0,所以第一个条件为真,我们选择-5 % -2,其值为-1。
6.(2020年职教高考题)以下程序段的运行结果是( )
int a=5,b=4,c=2,d=1;
if(a>b>c)d=3;
else d--;
printf("%d
",d);
A.0 B.1 C.2 D.3
【答案】A
【解析】a的值为5,b的值为4,c的值为2。首先计算(a>b),结果为真(因为5大于4),然后这个结果被隐式地转换为1。接着计算(1 > c),结果为假(因为1不大于2)。由于if语句的条件(a>b) > c的结果是假,它将执行else分支的代码,即d--。d的初始值为1,执行d--后,d的值变为0。最后,printf("%d
",d);将打印d的值,即0。
[限时练习]
1.下面程序段的运行结果是( )
int main() {
int a = 5, b = 4, c = 3, d = 2;
if (a > b > c)
printf("%d
", d);
else if ((c - 1 >= d) == 1)
printf("%d
", d + 1);
else
printf("%d
", d + 2);
return 0;
}
A.2 B.3 C.4 D.编译时有错,无结果
【答案】B
【解析】a的值为5,b的值为4,c的值为3,d的值为2。if语句中的条件a > b > c实际上是(a > b) > c。首先比较a和b,因为5大于4,结果为真,转换为1。然后比较1和c,因为1不大于3,所以整个条件为假。由于if条件为假,程序将执行else if语句。
else if语句的条件是((c - 1 >= d) == 1)。计算c - 1得到2,然后比较2和d(也是2),结果是真,转换为1。因为条件等于1,所以条件为真。由于else if条件为真,程序将执行printf("%d
", d + 1);,打印出d + 1的值,即3。
2.在执行以下程序时,为使输出结果为:t=4,则给a和b输入的值应满足的条件是( )
int main(void) {
int a,b,s,t;
scanf("%d,%d",&a,&b);
s = 1;
t = 1;
if(a > 0) s = s + 1;
if(a > b) t = s + t;
else if(a == b) t = 5;
else t = 2 * s;
printf("t=%d
",t);
return 0;
}
A.a>b B.a<b<0 C.0<a<b D.0>a>b
【答案】C
【解析】if(a > 0) s = s + 1; 这行代码会在 a 大于0时,将 s 的值增加1。初始时 s 的值为1,如果 a 大于0,s 将变为2。接下来,程序检查 a 和 b 的关系:如果 a > b,则 t 被设置为 s + t 的值。由于此时 s 至少为2(因为 a > 0),t 将至少为3(因为 t 的初始值为1)。如果 a == b,则 t 被设置为5。如果 a < b,则 t 被设置为 2 * s。如果 s 为2(a > 0),t 将被设置为4。因此,为了得到 t=4 的输出,a 必须小于 b 且 a 必须大于0,这样 s 将增加到2,然后 t 将被设置为 2 * s 的结果,即4。选项中描述 a 和 b 的条件是:A. a > b —— 这会导致 t 至少为3。B. a < b < 0 —— 这是不可能的,因为 a 不能同时小于 b 且小于0。C. 0 < a < b —— 这符合我们的条件,a 大于0且小于 b。D. 0 > a > b —— 这是不可能的,因为 a 不能同时小于 b 且大于0。
3.输入一个整数,判断这个整数是奇数还是偶数
【答案】
#include <stdio.h>
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num); // 读取用户输入的整数
if (num % 2 == 0) {
printf("这是一个偶数。
");
} else {
printf("这是一个奇数。
");
}
return 0;
}
4.输入一个字符,若是大写字母则转换为对应的小写字母并输出,若是小写字母则转换为对应的大写字母并输出。
【答案】
#include <stdio.h>
int main() {
char ch;
printf("请输入一个字符:");
scanf("%c", &ch); // 读取用户输入的字符
if (ch >= 'A' && ch <= 'Z') { // 判断是否为大写字母
ch = ch + ('a' - 'A'); // 转换为小写字母
} else if (ch >= 'a' && ch <= 'z') { // 判断是否为小写字母
ch = ch - ('a' - 'A'); // 转换为大写字母
} else {
printf("这不是字母。
");
return 0;
}
printf("转换后的字符是:%c
", ch);
return 0;
}
【归纳小结】
C语言的分支语句主要包括if、else、if-else和switch-case结构,它们基于条件表达式来控制代码的执行流程。条件运算符(三元运算符)提供了一种简洁的方式来在两种操作之间进行选择。
学科网(北京)股份有限公司
$$