第五章
本章要点
关系表达式
逻辑表达式
选择结构程序设计( if,switch)
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 3
§ 5.1 关系运算符和关系表达式
(一 )关系运算符及其优先次序
1,< (小于 )
2,<= (小于或等于 )
3,> (大于 )
4,>= (大于或等于 )
5,== (等于 )
6,!= (不等于 )
优先级相同(高)
优先级相同(低)
说明,左结合优先级:算术运算符 关系运算符 赋值运算符
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 4
(二 ) 关系表达式用关系运算符将两个表达式连接起来的式子,当关系式成立时返回 1,不成立时返回 0
例,a+b>b+c,(a=3)>(b=5),a>b= =c,a=b>c,5>3>2
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 5
§ 5.2 逻辑运算符和逻辑表达式
(一 )逻辑运算符及其优先次序
!(逻辑非 ) &&(逻辑与 ) || (逻辑或 )
结合方向,左结合优先次序,! 算术运算符 关系运算符 && ||
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 6
(二 )逻辑表达式用逻辑运算符将若干表达式连接起来的式子,表达式值为真时返回 1,否则返回 0。
如 a=4,b=5,c=6时:
!a值为 0 a&&b值为 1 a||b值为 1
!a||b值为 1 4&&0||2值为 1 5>3&&8<4-!0 值为 0
!(a<b)&&x>y; a<b&&a<c||a<0;
注:判断一个量时非零理解为真,零理解为假。
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 7
注意:
在逻辑表达式的求解中,并不是所有的逻辑运算符都要被执行。
(1)a&&b&&c 只有 a为真时,才需要判断 b的值,只有 a和 b都为真时,
才需要判断 c的值。
(2)a||b||c 只要 a为真,就不必判断 b和 c的值,只有 a为假,才判断 b。 a和 b都为假才判断 c
例,(m=a>b)&&(n=c>d)
当 a=1,b=2,c=3,d=4,m和 n的原值为 1时,表达式执行后 m值为 0,而 n的值仍为 1。
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 8
§ 5.3 if语句一,If语句的三种基本形式
if ( ) {
s1;s2;
}else
{ s3;
s4;}
if (s>85){g=?A?;}
else if(s>75){g=?B?;}
else if(s>60){g=?C?;}
else {g=?D?;}
注 (1)else子句是 if语句的一部分,不可单独使用
(2)else与 if之间只能间隔,一条,语句(复合语句算一条)
if( )
{
s1;
s2;
}
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 9
例 5.2 输入三个数 a,b,c,要求按由小到大的顺序输出。
例 5.1’ 输入一个年份判断它是否闰年
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 10
二,If语句的嵌套
if(x>=0)
if(x>0) y=1;
else y=0;
else
y=-1;
匹配规则:
else总是与它上面最近的未配对的 if语句配对,配对后可看作,一条,语句
if( )
if() 语句 1
else 语句 2
else
if() 语句 3
else 语句 4
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 11
例:
if( )
if( ) 语句 1
else
语句 2
例:
if( )
{if( ) 语句 1}
else
语句 2
注意花括号的作用及源代码的缩进与对齐
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 12
程序 1:
if(x<0)
y=-1;
else
if(x= =0) y=0;
else y=1;
X
为负数时?
X

0
时?
程序 2:
if(x>=0)
if(x>0) y=1;
else y=0;
else y=-1;
程序 3:
y=-1;
if(x!=0)
if(x>0) y=1;
else y=0;
程序 4:
y=0;
if(x>=0)
if(x>0) y=1;
else y=-1;
例 5.3 求符号函数的值,哪个是正确的?
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 13
三,条件运算符
格式:表达式1?表达式2 ∶ 表达式3
如,max=a>b?a:b
说明,(2)优先级:单目 算术 关系 逻辑 条件 赋值 逗号
(3)结合方向:自右至左,同赋值运算符和单目运算符,
如 a>b?a:c>d?c:d理解为 a>b?a:(c>d?c:d)
(4)条件表达式还可是赋值表达式或函数表达式,如:
x>0?y=x:y=-x;
x>0?printf(“%d”,y=x):printf(“%d”,y= -x);
(5)三个表达式的类型可各不相同,返回值类型为后两个表达式中较高的类型,如 x>y?1:1.5;当 x>y时返回 1.0
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 14
例 5.4输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。(用条件表达式实现)
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 15
§ 5.4 switch语句
switch(表达式)
{case 常量 表达式1:语句组1 ;break;
case 常量 表达式2:语句组2 ;break;

case 常量 表达式n:语句组n ;break;
default,语句n+1

Case后的常量表达式起语句标号作用,当 switch后的表达式与某一个 case后的 常量 表达式值相等时执行此 case后面所有的语句,直到遇到 break或 switch结束,若找不到则执行 default后的语句; default也可没有。注意 case常量表达式的值不能含变量 (switch可以 ),且不能重复。
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 16
例,按照成绩等级输出百分制分数段,用 switch语句实现:
switch(grade)
{
case?A?,printf(“85-100\n” );
case?B?,printf(“70-84\n” );
case?C?,printf(“60-69\n” );
case?D?,printf(“<60\n” );
default?E?,printf(“error\n” );

注:没有 break则不符题意,此外,switch语句实现的功能完全可以用 if..else… 实现
break;
break;
break;
break;
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 17
§ 5.5 程序举例理清思路 (用伪代码表示 ),自顶向下,逐步细化,画出 N-S图例 5.5:输入年份,判断是否闰年注意变量类型的选择,需要取余或整除时用整型例 5.6:求一元二次方程的解注意如何输出一个复数,以及如何判断两浮点数是否相等例 5.7:运输公司计算运费,考虑折扣问题 f=p*w*s*d
变量命名 /使用 if语句可实现 /使用 switch语句时注意总结规律并分组
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 18
作业:
用 N-S图表示 5.5 5.7(改成不多于 3位正整数 ) 5.9 5.10的算法上机:试验 18.4( 1)( 3)( 4)写源代码到试验报告,
上机时调试,并将遇到问题也写到试验报告中
C语言程序设计 (第三版) http://ccf.tsinghua.edu.cn 19
作业问题:
if(x<1)
y=x;
else if(1<=x<10)/*条件恒成立,且可简化 */
y=2x-1;/*语法错 */
else if(x>=10)/*可省略 if*/
y=3x-1;/*语法错 */
/*发生嵌套时内层 if常置于 else后 */
n%10 (n/10)%10 (n/100)%10?
先求出各位上的数字,之后据位数输出注意缩进与花括号的使用 if(a>b){t=a;a=b;b=c;}
注意何时用 else ifP96 else可否去掉,若不用 else如何处理?