第五章 选择结构程序设计
5.1 关系运算符和关系表达式
5.2 逻辑运算符和逻辑表达式
5.3 if语句
5.4 switch语句
5.5 程序举例
5.1 关系运算符和关系表达式注意,(1) 字符数据按其 ASCII码值进行比较
(2) 应避免两个实数作 = = 或 != 的比较一、关系运算符 > >= < <= == !=
1,优先级,低于纯算术类,高于赋值类
2,结合性,左结合性二、关系表达式,用关系运算符连接起来的式子关系表达式的值,只有 2个,真以 1 表示,假以 0 表示注意,(3) 表达式 5>2>7>8 是允许的,它相当于 ((5>2)>7)>8
(4) 可以将关系表达式看成是一种整型表达式关系表达式,<表达式 > <关系运算符 > <表达式 >
注意,关系表达式的值应是逻辑值,在 C中 无逻辑型数据 。
若关系表达式成立,其值为 1; 在 C中非零的值均表示逻 辑真若关系表达式不成立,其值为零; 零表示逻辑假。
已知,char c ; int i,j,k; double x,y;
c =?w?,i = 1,j = 2,k = -7,x = 7e+033,y = 0.001
a?+1< c (?a?+1)< c 1
3<j<5 (3<j)<5 1
1?-?0?= =1 (?1?-?0?)= =1 1
1?= =?0?+1?1?= =(?0?+1) 1
x<x+y x<(x+y) 1
i+j+k < =2*j ((i+j)+k)< =(2*j) 1
i<j= =x<y (i<j)= =(x<y) 0
i=j= =k<y i=(j= =(k<y) ) i= 0
表达式 等价表达式 表达式值
i=k<y i=(k<y) i= 1
5.2 逻辑运算符和逻辑表达式一,逻辑运算符 && || ! (与 或 非)
3个运算符的优先级由高到低为 !?&&? ||
! 的优先级高于关系运算,&&和 || 的优先级 低于关系运算
! 是右结合性,&& 和 || 是左结合性二、逻辑表达式
1.逻辑表达式的值应该是,逻辑真,或,逻辑假,,
逻辑运算的结果以 数值 1代表“真”,以数值 0代表“假” ;
进行判断时,非零值代表“真”,零值代表“假”
例,表示 x ∈[ -1,1]区间 应写为,x>=-1 && x<=1
2.逻辑运算中的规律
(1) 在 && 表达式中,若左端为 0,则不必再计算右端,
表达式值为 0 即,0 && a == 0
(2) 类似有 1 || a == 1
规律,
0||a ==a 0&&a==0
1||a==1 1&&a==a
a||a==a a&&a==a
a||!a==1 a&&!a==0
!(a||b)==!a&&!b !(a&&b)==!a||!b
表达式 等价表达式 表达式的值
2.逻辑表达式,
<表达式 > <&& 或 ||> <表达式 > (C的任何一种表达式均可 )
已知,char c ; int i,j,k; double x,y; c=?w?; i=j=k=3; x=0.0;y=2.3;
i && j && k (i && j) && k 1
x && i || j -2 (x && i) || (j-2) 1
x || i && j -3 x || (i && (j-3)) 0
i < j && x < y (i<j) && (x<y) 0
i = = j && x < = y (i= =j) && (x<=y) 1
x!=y&&j+1= =!k+4 (x!=y) && (j+1)= = ((!k)+4)) 1
A?<=c && c<=?Z? (?A? <= c) && (c <=?Z?) 0
i=i= =2||j= =4||k==6 i=((i= =2) || (j= = 4) || (k= =6)) 0
! ++ -- 算术运算符 关系运算符 = = != && ||
已学过的运算符优先级如下,
赋值和复合赋值符 逗号运算符运算符的 优先级 和结合性优先级 运算符 含义 要求运算 结合方向对象的个数圆括号下标运算符指向结构体成员运算符结构体成员运算符逻辑非运算符按位取反运算符自增运算符自减运算符负号运算符类型转换运算符指针运算符地址运算符长度运算符乘法运算符除法运算符求余运算符加法运算符减法运算符
1
2
3
4
( )
[ ]
.
!
~
++
- -
-
(类型 )
*
&
sizeof
*
/
%
+
-
1
(单目运算符 )
2
(双目运算符 )
2
(双目运算符 )
自右至左自左至右自左至右自左至右
5
9
10
11
2
(双目运算符 )
2
(双目运算符 )
2
(双目运算符 )
优先级 运算符 含义 要求运算 结合方向对象的个数左移运算符右移运算符关系运算符等于运算符不等于运算符按位与运算符按位异或运算符按位或运算符逻辑与运算符逻辑或运算符条件运算符赋值运算符逗号运算符
(顺序求值运算符 )
6
7
8
12
13
14
15
<<
>>
< <=
> >=
= =
!=
&
^
!
&&
||
,
= +=
&=
,
2
(双目运算符 )2
(双目运算符 )2
(双目运算符 )2
(双目运算符 )
2
(双目运算符 )3
(三目运算符 )
2 自右至左自右至左自左至右自左至右自左至右自左至右自左至右自左至右自左至右自左至右自左至右
5.3 if语句一,if 语句的两种形式
1,单分支形式,if ( 表达式 ) 语句
2,双分支形式,if ( 表达式 ) 语句 1 else 语句 2
执行过程,先计算表达式 的值,如果值为 1,就执行其后的语句,如果值为 0,就继续向下执行,
执行过程,先计算表达式的值,如果值为 1,就执行其后的语句 1,如果值为 0,就执行 else后的语句 2
说明,1,语句可以是简单语句或复合语句
2,表达式一般为逻辑或关系表达式,且应用 ( )括起来语句 1 语句 2
成立 不成立
P
语句成立
P
#include <stdio.h>
#include <math.h>
void main( )
{ int x,y;
scanf(“%d”,&x);
if (x<=0) y=0;
if (x>0) y=pow(x,3)+x+1;
printf(“y=%d\n”,y);
}
例,编程求解函数 Y= 0 X<=0
X3+X+1 X>0
#include <stdio.h>
#include <math.h>
void main( )
{ int x,y;
scanf(“%d”,&x);
if (x<=0) y=0;
else y=pow(x,3)+x+1;
printf(“y=%d\n”,y);
}
格式 功能
if (表达式 ) 语句
if (表达式 ) 语句 1else 语句 2
if(表达式 1)语句 1
else if (表达式 2)
语句 2
else if((表达式 n)
语句 n
else 语句 n+1
--
表达式值非 0? 表达式值非 0?
表达式值非 0? 表达式值非 0?
表达式 1值非 0?
表达式 2值非 0?
表达式 3值非 0?
表达式 n值非 0?
语句 语句语句 1 语句 2 语句 1 语句 2
语句 2 语句 n+1语句 3 语句 n语句 1
Y
N
Y
Y
Y
Y
Y
YY
N
N
N
N
N
N
...
条件语句例,输入 3个数,按由小到大的顺序输出输入 a,b,c
a>b?
ab
a>c?
b>c?
ac
bc
输出 a,b,c
是是是否否否
#include <stdio.h>
void main( )
{ int a,b,c,t;
scanf(“%d%d%d”,&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 语句规定,在 if 嵌套结构中,else是与其前面最近的尚未配对的 if 配对
(就近原则),所以第一种理解是正确的。
1,if (表达式 1)
if (表达式 2) 语句
4,if① (表达式 1)
if② (表达式 2) 语句 1
else 语句 2
2,if (表达式 1) 语句 1
else if (表达式 2) 语句 2
3,if (表达式件 1) 语句 1
else if (表达式 2) 语句 2
else 语句 3
对第 4种形式可以有两种理解方式,
(1) if① (表达式 1)
{ if② (表达式 2) 语句 1
else② 语句 2
}
(2) if① (表达式 1)
{ if② (表达式 2) 语句 1 }
else① 语句 2
例,编程求解函数 y =
-1 x<0
0 x=0
1 x>0
方法 1
if (x<0) y=-1;
else
if (x==0) y=0;
else y=1;
方法 2
if (x>=0)
if (x>0) y=1;
else y=0;
else y=-1;
y=-1 y=0 y=1
x<0
x==0
真 假真 假
y=-1
y=0y=1
x>=0
x>0
真 假真 假方法 3
y=-1;
if(x!=0)
if(x>0) y=1;
else y=0;
y =
-1 x=0
0 x<0
1 x>0
y=-1
x!=0
x>0
y=1 y=0
真真假假修改方法 3
y=-1;
if(x!=0)
{ if(x>0) y=1; }
else y=0;
y=-1
x!=0
x>0
y=1 y=0
真真假假例,试编程,当键入 +,-,*,/ 时,分别计算并输出 x+y,x-y,
x*y,x/y的值
main ( )
{ int x,y ; char c1;
scanf (“x=%d,y=%d,c1=%c”,&x,&y,&c1);
if (c1= =?+?)
printf (“%d + %d = % d \n”,x,y,x+y);
else if (c = =?-?)
printf (“%d - %d = %d \n”,x,y,x-y);
else if (c = =?*?)
printf (“%d * %d = %d \n”,x,y,x*y);
else
printf (“%d / %d = %d \n”,x,y,x/y);
}
三,条件运算例 max=a>b? a,b+1
a>b? a,c>d? c,d
注意,(1) 表达式 1,表达式 2和表达式 3 的数据类型可以互不相同
(2) 条件表达式的值的数据类型与表达式 2,表达式 3中数据类型较高的那个保持一致如 7>5? 10,1.4 条件表达式的值为 10.0
a>b? a,(c>d? c,d )
1,条件运算符?,( 唯一的三目运算符 )
优先级仅高于赋值类,是右结合性执行过程,先计算表达式 1,若其值为非零值 (真 ),则计算表达式 2 的值,
该条件表达式的值即为表达式 2 的值 ; 若表达式 1的值为零 (假 ),
则计算表达式 3 的值,该条件表达式的值即为表达式 3 的值
2,条件表达式的一般形式,表达式 1? 表达式 2,表达式 3
max=(a>b? a,b+1)
用条件表达式实现
#include<stdio.h>
void main( )
{ int max;
max=x>y? x,y ;
max=z>max? z,max;
printf(“max=%d”,max);
}
当 if中的语句为简单赋值语句时,我们可以用条件表达式来取代 if 语句例 求 3个数中的最大数
#include<stdio.h>
void main( )
{ int max;
if (x>y) max=x;
else max=y;
if (z>max) max=z;
printf(“max=%d”,max);
}
5.4 switch语句一,switch语句的格式
switch ( 表达式 )
{
case 常量表达式 1,语句 1
case 常量表达式 2,语句 2
:,,
case 常量表达式 n,语句 n
default,语句 n+1
}
注意,
1,表达式一般多为整型或字符型表达式
2,case后常量表达式的值必须互不相同
3,case和 default的出现次序不影响结果
4,语句 1至语句 n+1为复合语句时可省略 { }
5,多个 case可以共用一组执行语句
6,Switch语句可以嵌套格式,switch (表达式 )
{ case 常量表达式 1,语句系列 1
case 常量表达式 2,语句系列 2
.,,
case 常量表达式 n,语句系列 n
default,语句系列 n+1
}
功能,(条件,语句系列 1----语句系列 n 后均有 break 语句 )
表达式值
=<常量表达式 1>时该开关合上计算表达式值
...
语系 1 语系 2 语系 n 语系 n+1
表达式值与某常量表达式值相匹配,则对应开关合上,执行对应语句系列
switch语句的执行过程,
① 计算 switch后表达式的值
② 如果表达式的值与某个 case常量表达式的值相等时,就执行此 case后的语句,
执行完后将继续执行下一个 case后的语句,
如果表达式的值与所有 case常量表达式的值都不同,就执行 default后的语句例 void main ( )
{ int x,y ;
scanf(“%d”,&x) ;
switch (x)
{ case 1,y=10 ; printf(“%d\n”,y) ;
case 2,y=20 ; printf(“%d\n”,y) ;
case 3,y=30 ; printf(“%d\n”,y) ;
default,y=0 ; printf(“%d\n”,y) ;
}
}
如果输入 x为 2
则输出,20
30
0
如果输入 x为 6
则输出,0
注意,在执行一个 case 分支后,应用 break语句结束 switch语句
void main ( )
{ int x,y ;
scanf(“%d”,&x) ;
switch (x)
{ case 1,y=10 ; printf(“%d\n”,y) ; break;
case 2,y=20 ; printf(“%d\n”,y) ; break;
case 3,y=30 ; printf(“%d\n”,y) ; break;
default,y=0 ; printf(“%d\n”,y) ;
}
} 如果输入 x为 2
则输出,20
如果输入 x为 6
则输出,0
例:用 switch 编程,当键入 +,-,*,/ 时,分别计算并输出 x+y,x-
y,x*y,x/y的值
main( )
{ int x,y; char c1;
scanf(“x=%d,y=%d,c1=%c”,&x,&y,&c1);
switch(c1)
{ case?+?,printf(“%d+%d=%d\n”,x,y,x+y);
break;
case?-?,printf(“%d-%d=%d\n”,x,y,x-y);
break;
case?*?,printf(“%d* %d=%d\n”,x,y,x*y);
break;
case?/?,printf(“%d / %d=%d\n”,x,y,x/y);
break;
}
}
课 后 作 业课本 P111 习题 5.3 5.5 5.6 5.9