Professional Documents
Culture Documents
第 4 章 选择结构
C 语言提供了可以进行逻辑判断的若干选择语句 , 由这些
选择语句可构成程序中的选择结构 , 通常又称为分支结构 ,
它将根据逻辑判断的结果决定程序的不同流程。选择结构
是结构化程序设计的三种基本结构之一。
关系运算和逻辑运算
if 语句和用 if 语句构成的选择结构
条件表达式构成的选择结构
switch 语句以及用 switch 语句和 break 语句构
成的选择结构
关系运算和逻辑运算
C 语言的逻辑值
关系运算符和关系表达式
逻辑运算符和逻辑表达式
关系运算和逻辑运算
—— C 语言的逻辑值
关系表达式和逻辑表
达式的运算结果是一
个逻辑值。 C 语言没有
专门的“逻辑值” ,
用非 0 表示“真” ,
用 0 表示“假”。
因此 , 对于任意一个
表达式 , 如果值为 0,
就代表“假”值 ; 如
果值是非零 , 则代表
“真”值。
所谓关系运算实际上是“比较运算” , 即进行两个数的比较 , 判断比较的结果是否符合指定的条件。
关系运算和逻辑运算
——关系运算符和关系表达式
所谓关系运算实际上是“比较运算” , 即进行两个数的
比较 , 判断比较的结果是否符合指定的条件。
关系表达式及关系表达式的值
C 语言的关系运算符
所谓关系运算实际上是“比较运算” , 即进行两个数的比较 , 判断比较的结果是否符合指定的条件。
关系运算和逻辑运算
——关系运算符和关系表达式
所谓关系运算实际上是“比较运算” , 即进行两个数的
比较 , 判断比较的结果是否符合指定的条件。
C 语言提供了 6 种关系运算符:
1) < ( 小于 )
2) <= ( 小于或等于 )
C 语言的
关系运算 3) > ( 大于 )
符 4) >= ( 大于或等于 )
5) == ( 等于 )
6) ! = ( 不等于 )
所谓关系运算实际上是“比较运算” , 即进行两个数的比较 , 判断比较的结果是否符合指定的条件。
关系运算和逻辑运算
——关系运算符和关系表达式
所谓关系运算实际上是“比较运算” , 即进行两个数的
比较 , 判断比较的结果是否符合指定的条件。
注意
由两个字符组成的运算符之间不允许有空格 , 如 : <=
不能写成 < = 。
关系运算符是双目运算符 , 具有自左至右的结合性。
关系运算符的优先级
C 语言的 < 、 <= 、 > 、 >= 的优先级别相同
关系运算 == 、 != 的优先级相同
符 前四种的优先级高于后两种。
关系运算符、算术运算符和赋值运算符之间的优先级
次序是 : 算术运算符的优先级别最高 ,
关系运算符次之 , 赋值运算符的优先级别最低。
所谓关系运算实际上是“比较运算” , 即进行两个数的比较 , 判断比较的结果是否符合指定的条件。
关系运算和逻辑运算
——关系运算符和关系表达式
所谓关系运算实际上是“比较运算” , 即进行两个数的
比较 , 判断比较的结果是否符合指定的条件。
由关系运算符构成的表达式 ,
称为关系表达式。关系运算符
两边的运算对象可以是 C 语言
中任意合法的表达式。 关系表达
a >=b 、 (a =3) >(b =4) 、 a >c 式及关系
表达式的
==c 都是合法的关系表达式。 值
关系运算的值为“逻辑值” ,
只有两种可能 : 整数 0 或者整
数1。
所谓关系运算实际上是“比较运算” , 即进行两个数的比较 , 判断比较的结果是否符合指定的条件。
关系运算和逻辑运算
——关系运算符和关系表达式
所谓关系运算实际上是“比较运算” , 即进行两个数的
比较 , 判断比较的结果是否符合指定的条件。
例如
逻辑表达式和逻辑表达式的值
C 语言的逻辑运算符
关系运算和逻辑运算
——逻辑运算符和逻辑表达式
C 语言提供了三种逻辑运算符 :
1) && 逻辑“与”
2) ‖ 逻辑“或”
3) ! 逻辑“非”
由逻辑运算符和运算对象组成的表达式称为逻辑表达式。
逻辑运算的对象可以是 C 语言中任意合法的表达式。
逻辑表达式的运算结果或者为 1(“ 真” ), 或者为 0(“ 假” ) 。
例如
当 (x>y) 为真 ,a 和 b 为任意合法表达式 , 则
若变量 a 和 b 的值分别为 10 和 16, 则 (a>b)&&(x>y) 为“假” ,
表达式的值为 0;
若变量 a 和 b 的值分别为 10 和 6, 则 (a>b)&&(x>y) 为“真” ,
表达式的值为 1 。
关系运算和逻辑运算
——逻辑运算符和逻辑表达式
规则
关系运算和逻辑运算
——逻辑运算符和逻辑表达式
注意
由 && 或‖构成的逻辑表达式 :
1)a++&&b++
若 a 的值为 0, 表达式先求 a++ 的值 , 表达式 a++ 的值为 0, 系统可以确定逻
辑表达式的运算结果总是为 0, 因此跳过 b++ 不再对它进行求值。这时 ,a 的
值将自增 1, 由 0 变成 1, 而 b 的值将不变。
若 a 的值不为 0, 则系统不能仅根据 a++ 的值确定逻辑表达式的运算结果 ,
要对 && 右边的 b++ 求值 , 使 b 的值改变。
2)a++‖b++
若 a 的值为 1, 表达式先求 a++ 的值 , 由于 a++ 的值为 1, 系统可确定逻辑表
达式的运算结果总是为 1, 因此跳过 b++ 不再对它进行求值。这时 ,a 的值自
增 1,b 的值将不变。若 a 的值为 0, 则系统不能仅根据 a++ 的值确定逻辑表达
式的运算结果 , 要再对‖右边的表达式 b++ 进行求值 , 运算结果不仅使 a 的
值改变 , 也改变了 b 的值。
if 语句和用 if 语句构成的选择结构
if 语句
• 不含 else 子句的 if 语句
• 含 else 子句的 if 语句
• 关于 if 语句的说明
嵌套的 if 语句
if 语句
• 不含 else 子句的 if 语句
• 含 else 子句的 if 语句
• 关于 if 语句的说明
if 语句的两种基本形式 :
1) if( 表达式 ) 语句
2) if( 表达式 ) 语句 1
else 语句 2
if 语句和用 if 语句构成的选择结构
if 语句
• 不含 else 子句的 if 语句
• 含 else 子句的 if 语句
• 关于 if 语句的说明
语句形式
if ( 表达式 ) 语句
例如 :
if(a<b){ t=a;a=b;b=t; }
其中 , 在一对圆括号中的表达式可以是 C 语言中任意合法的表达式。表达式之后只
能是一条语句 , 称为 if 子句。如果该子句中含有多个语句 , 则必须使用复合语句。
if 语句的执行过程 :
首先计算 if 后面一对圆括号中的表达式的值 ;
如果表达式的值为非零 , 则执行 if 子句 , 否则 , 则跳过 if 子句 ;
执行 if 语句后的下一条语句 ;
if 语句和用 if 语句构成的选择结构
if 语句
• 不含 else 子句的 if 语句
• 含 else 子句的 if 语句
• 关于 if 语句的说明
if 语句
• 不含 else 子句的 if 语句
• 含 else 子句的 if 语句
• 关于 if 语句的说明
程序执行过程如下 :
printf 在屏幕上显示提示信息 :Enter x&y:
scanf 等待用户给变量 x 、 y 输入两个整数 , 然后把输入的两个数显示在屏幕上。
2) 计算表达式 x>y 的值。
如果 x 大于 y, 则调用 printf 函数输出 x 的值 ; 否则 , 跳过此输出继续执行 3) 。
3) 计算表达式 y>x 的值。
如果 y 大于 x, 则调用 printf 函数 , 输出 y 的值 ; 否则 , 跳过此输出继续执行
4) 。
4) 计算表达式 x==y 的值。
如果 x 等于 y, 则调用 printf 函数 , 输出 x==y 和 x 的值 ; 否则 , 跳过此输出继续
执行 5) 。
5) 程序结束。
if 语句和用 if 语句构成的选择结构
if 语句
• 不含 else 子句的 if 语句
• 含 else 子句的 if 语句
• 关于 if 语句的说明
#include<stdio.h>
例 4.2 输入三个整数 , 分别放在 main()
变量 a 、 b 、 c 中 , 然后把输入的 { int a, b, c, t;
数据重新按由小到大的顺序放在 printf ( " input a,b,c: " );
变量 a 、 b 、 c 中 , 最后输出 scanf ( " %d %d %d " , &a, &b, &c );
a 、 b 、 c 中的值。 printf ( " a =%d, b =%d, c =%d\ n " , a, b,
c );
if (a >b) { t =a; a =b; b =t; }
if (a >c) { t =a; a =c; c =t; }
if (b >c) { t =b; b =c; c =t; }
printf ( " %d,%d,%d\ n " , a, b, c );
}
if 语句和用 if 语句构成的选择结构
if 语句
• 不含 else 子句的 if 语句
• 含 else 子句的 if 语句
• 关于 if 语句的说明
语句形式
if ( 表达式 ) 语句 1
else 语句 2
例如 :
if ( a ! =0 ) printf ( " a ! =0\ n " );
else printf ( " a ==0\ n " );
其中,“语句 1” 称为 if 子句,“语句 2” 称为 else 子句 , 这些子句只允
许为一条语句 , 若需要多条语句时,则应该使用复合语句。
注意 :else 不是一条独立的语句,它只是 if 语句的一部分,因此, else
必须与 if 配对使用。
if 语句和用 if 语句构成的选择结构
if 语句
• 不含 else 子句的 if 语句
• 含 else 子句的 if 语句
• 关于 if 语句的说明
if - else 语句的执行过程:
1 )计算表达式的值;
2 )如果表达式的值为非 0 ,则执行 if 子句,跳过 else 子句;
3 )如果表达式的值为 0 ,则跳过 if 子句,执行 else 子句;
4 )继续执行 if 语句之后的下一条语句。
if 语句和用 if 语句构成的选择结构
if 语句
• 不含 else 子句的 if 语句
• 含 else 子句的 if 语句
• 关于 if 语句的说明
if 语句
• 不含 else 子句的 if 语句
• 含 else 子句的 if 语句
• 关于 if 语句的说明
if 语句
• 不含 else 子句的 if 语句
• 含 else 子句的 if 语句
• 关于 if 语句的说明
嵌套的 if 语句
嵌套的 if 语句
语句形式 :
if ( 表达式 1 )
if ( 表达式 2 ) 语句 1
else 语句 2
else
语句 3
当表达式 1 的值为非 0 时 , 执行内嵌的 if - else 语句 ; 当表达
式 1 的值为 0 时 , 执行语句 3 。
if 语句和用 if 语句构成的选择结构
嵌套的 if 语句
语句形式 :
if ( 表达式 1 )
{ if ( 表达式 2 ) 语句 1 }
else
语句 2
注意 : 在 if 子句中的一对花括号不可少。因为 else 子句总是
与前面最近的不带 else 的 if 相结合。
if 语句和用 if 语句构成的选择结构
嵌套的 if 语句
语句形式 :
1) 内嵌的 if 语句带有 else: 2) 内嵌的 if 语句不带 else:
if ( 表达式 1 ) 语句 1 if ( 表达式 1 ) 语句 1
else if ( 表达式 2 ) 语句 2 else if ( 表达式 2 ) 语句 2
else 语句 3
嵌套的 if 语句
嵌套的 if 语句
执行过程 :
从上向下逐一对 if 后的表达式进行检测,当某一个表达式的值
为非 0 时 , 就执行与此有关子句中的语句,其余部分不执行。如
果所有表达式的值都为 0, 则执行最后的 else 子句,如果没有
最后的那个 else 子句 , 将不进行任何操作。
if 语句和用 if 语句构成的选择结构
嵌套的 if 语句
#include<stdio.h>
例 4.5 编写程序 , 根据输入的学 main()
生成绩给出相应的等级 , 大于或 { int g;
等于 90 分以上的等级为 A ,60 printf ( " Enter g: " ); scanf ( " %d
分以下的等级为 E, 其余每 10 分 " ,&g);
为一个等级。 printf ( " \ng =%d : " , g );
if ( g >=90 ) printf ( " A \ n " );
程序运行实例: else if ( g >=80 ) printf( " B\ n " );
Enter g: 72<CR> else if ( g >=70 ) printf ( " C\ n " );
g =72: C else if ( g >=60 ) printf ( " D\ n " );
else printf ( " E\ n " );
}
条件表达式构成的选择结构
1. 条件运算符 ? :
• 这是 C 语言提供的唯一的三目运算符。
2. 条件运算符构成的条件表达式
3 . 条件表达式的运算功能
4. 条件运算符的优先级
• 条件运算符优先于赋值运算符 , 但低于关系运算符和算术运算符。例如 :
• y =x >10 ? 100 : 200
• 首先求出条件表达式的值 , 然后赋给 y 。在条件表达式中 , 先求 x >10 的值。若 x 大于 10, 取 100 作为表达式的值
并赋给变量 y; 否则取 200 作为表达式的值并赋给变量 y 。
switch 语句以及用 switch 语句和 break 语
句构成的选择结构
switch 语句
• switch 语句形式如下 :
switch ( 表达式 )
{ case 常量表达式 1 : 语句 1
case 常量表达式 2 : 语句 2
case 常量表达式 n : 语句 n
default : 语句 n +1
}
switch 语句以及用 switch 语句和 break 语
句构成的选择结构
switch 语句
switch 语句的执行过程
• 计算紧跟其后一对括号中的表达式的值;
• 在 switch 语句体内寻找与表达式的值吻合的 case 标号;
• 如果有与表达式的值相等的标号 , 则执行该标号后的各语句 , 直到 switch 语句体结束 ; 如果没
有与该值相等的标号 , 且存在 default 标号 , 则从 default 标号后的语句开始执行 , 直到 switch
语句体结束 ; 如果没有与该值相等的标号 , 同时又没有 default 标号 , 则跳过 switch 语句体;
• 执行 switch 语句之后的语句。
switch 语句以及用 switch 语句和 break 语
句构成的选择结构
switch 语句的执行过程
#include<stdio.h>
main()
例 4.6 用 switch 语句改写例 { int g;
4.5 。 printf ( " Enter a mark : " ); scanf( " %d
" , &g ); / 倡 g 中存放学生的成绩倡 /
程序执行实例 : printf ( " g =%d : " , g ) ;
Enter a mark: 85 switch ( g /10 )
<CR> { case 10 :
g =85 : B case 9 : printf ( " A \ n " );
C case 8 : printf ( " B\ n " );
D case 7 : printf ( " C\ n " );
E case 6 : printf ( " D\ n " );
default : printf ( " E\ n " );
}
}
switch 语句以及用 switch 语句和 break
语句构成的选择结构
用 break 语句修改例 4.6 的程序如下: