第四章 选择结构程序设计
?4.1关系运算符和表达式
?关系运算符
?种类, < <= == >= > !=
?结合方向,自左向右
?优先级别:
<
<=
>
>=
==
!=
优先级 6(高)
优先级 7(低)例 c>a+b //c>(a+b)
a>b!=c //(a>b)!=c
a==b<c //a==(b<c)
a=b>c //a=(b>c)
?关系表达式的值:是逻辑值“真”或“假”,用 1和 0表

例 int a=3,b=2,c=1,d,f;
a>b
(a>b)==c
b+c<a
d=a>b
f=a>b>c
< >
//表达式值 1
//表达式值 1
//表达式值 0
//d=1
//f=0
C













?关系运算注意:
< >
例 若 a=0; b=0.5; x=0.3;
则 a<=x<=b的值为 0
例 5>2>7>8在 C中是允许的,
值为 0
例 int i=1,j=7,a;
a=i+(j%4!=0);
则 a= 2
例 ‘ a?>0 结果为
‘ A?>100 结果为
1
0













C
?关系运算注意:
例 注意区分,=”与,==”
int a=0,b=1;
if(a=b)
printf(“a equal to b”);
else
printf(“a not equal to b”);
例 应避免对 实数 作相等或不等的判断
如 1.0/3.0*3.0==1.0 结果为
可改写为,fabs(1.0/3.0*3.0-1.0)<1e-6
0













C
a b !a !b a&&b a||b




假假


?4.2逻辑运算符和表达式
?逻辑运算符
?种类,! && ||
?逻辑运算真值表
?C语言中,运算量, 0表示, 假,,
非 0表示, 真,,
运算结果, 0表示, 假,,
1表示, 真,,
< >





























C
! (2)
&& (11)
|| (12)


例 a<=x && x<=b
a>b&&x>y
a==b||x==y
!a||a>b
?优先级:
?结合方向:
!,从右向左
&&,从左向右
||,从左向右
< >
// (a<=x) && (x<=b)
//(a>b)&&(x>y)
//(a==b)||(x==y)
//(!a)||(a>b)













C
! (2)
&& (11)
|| (12)


?优先级:
?结合方向:
!,从右向左
&&,从左向右
||,从左向右
例 a=4;b=5;
!a
a&&b
a||b
!a||b
4&&0||2
5>3&&2||8<4-!0
?c?&&?d?
< >
值为 1
值为 0
值为 1
值为 1
值为 1
值为 1
//(5>3)&&2||(8<(4-(!0))) 值为 1













C
! (2)
&& (11)
|| (12)


?优先级:
?结合方向:
!,从右向左
&&,从左向右
||,从左向右
?短路特性,逻辑表达式求解时,并非所有的逻辑运算
符都被执行,只是在必须执行下一个逻辑运算符才能
求出表达式的解时,才执行该运算符
< >
例 a&&b&&c //只在 a为真时,才判别 b的值;
只在 a,b都为真时,才判别 c的值
例 a||b||c //只在 a为假时,才判别 b的值;
只在 a,b都为假时,才判别 c的值
例 a=1;b=2;c=3;d=4;m=1;n=1;
(m=a>b)&&(n=c>d) //结果 m=0,n=1













C
§ 4.3 选择型程序设计
?if语句 (条件选择语句)
?if语句的三种形式
?形式一:
?格式,if (expression)
statement
?执行过程:
expr
statement
非 0
=0
例,if (x>y)
printf(“%d”,x); expr
statement1 statement2
非 0 =0?形式二,
?格式, if (expression)
statement1
else
statement2
?执行过程,例,if (x>y) max=x;
else max=y;
?形式三:
?格式:
if ( expr1 ) statement1
else if (expr2 ) statement2
else if (expr3 ) statement3
…...
[ else statementn ]
expr1
statemnt1
非 0
=0
expr2
expr3
statemntnstatemnt3statemnt2
非 0
非 0
=0
=0
?执行过程:
例,if (salary>1000) index=0.4;
else if (salary>800) index=0.3;
else if (salary>600) index=0.2;
else if (salary>400) index=0.1;
else index=0;
如,if(a==b&&x==y) printf(“a=b,x=y”);
if(3) printf(“OK”);
if(?a?) printf(“%d”,?a?);
?说明:
?if后面的表达式类型任意
?语句可以是复合语句
? if(x) ? if(x!=0)
if(!x) ? if(x==0)
例 考虑下面程序的输出结果,
#include <stdio.h>
main()
{ int x,y;
scanf(“%d,%d”,&x,&y);
if(x>y)
x=y; y=x;
else
x++; y++;
printf(“%d,%d\n”,x,y);
}
Compile Error!
/*ch4_1.c*/
#include <stdio.h>
main()
{ int x,y;
printf("Enter an integer:");
scanf("%d",&x);
y=x;
if(y<0)
y= -y;
printf("\ninteger:%d--->absolute value:%d\n",x,y);
}
例 求一个数的绝对值
运行,Enter an integer:-12?
integer:-12--->absolute value,12
/*ch4_2.c*/
#include <stdio.h>
main()
{ int a,b;
printf("Enter integer a:");
scanf("%d",&a);
printf("Enter integer b:");
scanf("%d",&b);
if(a==b)
printf("a==b\n");
else
printf("a!=b\n");
}
例 输入两个数并判断两数相等否
运行,Enter integer a:12?
Enter integer b:12?
a==b
运行,Enter integer a:12?
Enter integer b:9?
a!=b
/*ch4_3.c*/
#include <stdio.h>
main()
{ char c;
printf("Enter a character:");
c=getchar();
if(c<0x20) printf("The character is a control character\n");
else if(c>='0'&&c<='9') printf("The character is a digit\n");
else if(c>='A'&&c<='Z') printf("The character is a capital letter\n");
else if(c>='a'&&c<='z') printf("The character is a lower letter\n");
else printf("The character is other character\n");
}
例 判断输入字符种类
运行,Enter a character,?
The character is a control character
运行,t t, 8 ?
t i digi
运行,Enter a character,D?
The character is a capital letter
运行,Enter a character,h
he character is a lower let er
运行,Enter a ch racter,F1 ?
The character is other character
?if语句嵌套,
?一般形式:
if (expr1)
if (expr2) statement1
else statement2
else
if(expr3) statement3
else statement4
内嵌 if
内嵌 if
if (expr1)
if (expr2)
statement1
else
statement2
内嵌 if
if (expr1)
if (expr2)
statement1
else
statement3
内嵌 if
if (expr1)
statement1
else
if(expr3)
statement3
else
statement4
内嵌 if
例 输入两数并判断其大小关系
/*ch4_4.c*/
#include <stdio.h>
main()
{ int x,y;
printf("Enter integer x,y:");
scanf("%d,%d",&x,&y);
if(x!=y)
if(x>y) printf("X>Y\n");
else printf("X<Y\n");
else
printf("X==Y\n");
}
运行,Enter integer x,y:12,23?
X<Y
Enter integer x,y:12,6?
X>Y
Enter integer x,y:12,12?
X==Y
?if ~ else 配对原则,缺省 { }时,else总是和它
上面离它最近的未配对的 if配对
if(……)
if(……)
if(……)
else…...else…...
else…...
例,if (a==b)
if(b==c)
printf(“a==b==c”);
else
printf(“a!=b”);
修改,if (a==b)
{ if(b==c)
printf(“a==b==c”);
}
else
printf(“a!=b”);
实现 if ~ else 正确配对方法:加 { }
例 考虑下面程序输出结果,
main()
{ int x=100,a=10,b=20;
int v1=5,v2=0;
if(a<b)
if(b!=15)
if(!v1)
x=1;
else
if(v2) x=10;
x=-1;
printf(“%d”,x);
}
结果,-1
?switch语句 ( 开关分支语句 )
?一般形式,switch( 表达式 )
{ case E1:
语句组 1;
break;
case E2:
语句组 2;
break;
…….
case En:
语句组 n;
break;
[default:
语句组 ;
break;]
} ?执行过程,
switch
表达式
语句组 1 语句组 2 语句组 n 语句组…...
E 1 E 2 En default
case
?说明:
?E1,E2,… En是 常量表达式,且值必须互不相同
?语句标号作用,必须用 break跳出
?case后可包含多个可执行语句,且不必加 { }
?switch可嵌套
?多个 case可共用一组执行语句
如,……
case ?A?:
case ?B?:
case ?C?,
printf(“score>60\n”);
break;
……..
例 switch(score)
{ case 5,printf(“Very good!”);
case 4,printf(“Good!”);
case 3,printf(“Pass!”);
case 2,printf(“Fail!”);
default, printf(“data error!”);
}
运行结果,score为 5时,输出:
Very good! Good! Pass! Fail! data error!
例 void main()
{ int x=1,y=0,a=0,b=0;
switch(x)
{ case 1:
switch(y)
{ case 0,a++; break;
case 1,b++; break;
}
case 2,a++;b++; break;
case 3,a++;b++;
}
printf(“\na=%d,b=%d”,a,b);
}
运行结果,a=2,b=1
/*ch4_5.c*/
#include <stdio.h>
main()
{ int c;
printf("Enter m or n or h or other:");
c=getchar();
switch(c)
{ case 'm',printf("\nGood morning!\n");break;
case 'n',printf("\nGood night!\n"); break;
case 'h',printf("\nHello!\n"); break;
default, printf("\n\n"); break;
}
}
例 根据输入字母输出字符串
?条件运算符与表达式
?一般形式,expr1? expr2, expr3
?执行过程
?功能:相当于条件语句,但不能取代一般 if语句
例 if (a>b)
printf(“%d”,a);
else
printf(“%d”,b);
printf(“%d”,a>b?a:b);
例 求 a+|b|
printf(“a+|b|=%d\n”,b>0?a+b:a-b);
expr1
取 expr2值 取 expr3值
非 0 =0
例 (a==b)??Y?:?N?
(x%2==1)?1:0
(x>=0)?x:-x
(c>=?a? && c<=?z?)?c-?a?+?A?:c
?条件运算符可嵌套
如 x>0?1:(x<0?-1:0)
?优先级, 13
?结合方向,自右向左
如 a>b?a:c>d?c:d ? a>b?a:(c>d?c:d)
?expr1,expr2,expr3类型可不同,表达式值取较高的
类型
< >
例 x??a?:?b? //x=0,表达式值为‘ b?; x?0,表达式值为‘ a?
x>y?1:1.5 //x>y,值为 1.0; x<y,值为 1.5













C