第五章 逻辑运算和选择结构第一节 关系运算符和关系表达式关系运算实际上就是一种,比较运算,,
即用关系运算符对两个运算量进行比较,比较他们之间的,大小关系,。
例,关系表达式,
y>3
用于判断 y是否大于 3
1.关系运算符及其优先次序运算符 名称 示例
<
<=
>
>=
==
!=
小于小于或等于大于大于或等于等于不等于
a<b
a<=b
a>b
a>=b
a==b
a!=b
示例说明
a小于 b
a小于或等于 b
a大于 b
a大于或等于 b
a等于 b
a不 等于 b
优先次序优先级相同
(高)
优先级相同
(低)
C语言中的关系运算符关于优先次序的说明如下:
( 1)关系、算术、赋值运算符的优先级关系如下:
算术运算符(高) 关系运算符(中) 赋值运算符(低)
( 2)关系运算符的结合方向是,自左向右,
例,
c+d>a+b (c+d)>a+b
a>b!=c (a>b)!=c
a==b<x a==(b<x)
a=b>=c a=(b>=c)
x!=a*b<c x!=((a*b)<c)
2.关系表达式例,
x<y,2*a+b<c-d,(x=2)<=(y=4),?a?<?b?
在 C语言中,关系表达式的结果为 1或 0。
当关系表达式成立时,其结果为 1;
否则值为 0。
例,3<2的值为
5! =81的值为
0
1
例,试求 x=5>3>1 的值分析,x=5>3>1 x=(5>3)>1
=1>1
=0
例,若 a=3,b=4,c=5
则 a>b
a+b>c
f=a<b<c
f=a>b>c 表达式值为表达式值为表达式值为表达式值为 0
0
1
1
第二节 逻辑运算符和逻辑表达式关系表达式只适用于描述单一的条件,
如,x>0用于描述,x大于 0”,对于较复杂的复合条件就需要若干个表等式连接起来才能描述,如,描述,x大于 0且不等于 2”,
就需要将两个表达式 x>0和 x!=2连接起来,
即 x>0&&x!=2,其中,&&”是 C语言中的逻辑运算符。
1.逻辑运算符及其优先次序运算符 名称 示例
!
&&
||
逻辑非逻辑与逻辑或
!a
a&&b
a||b
示例说明
a非
a与 b
a或 b
优先次序高低
C语言中的逻辑运算符关于优先次序的说明如下:
( 1)逻辑运算符的结合方向是,自左向右,。
( 2)
运算符 优先次序
!(非)
算术运算符关系运算符
&&和 ||
赋值运算符高低运算符的优先级例,
(a>b)&&(x>y) a>b&&x>y
(a==b)||(x==y) a==b||x==y
(!a)||(a>b) !a||a>b
2.逻辑表达式一个逻辑表达式中可以包含多个逻辑运算符。
如,x>y&&a<=b-!c
在 C语言中,参与逻辑运算的量为 非零值 或 整数零,非零值 和 整数零 分别表示运算量为,真,或,假,。
C语言编译系统在给出运算结果时,以数值 1代表,真,
以数值 0代表,假,。
例,
a&&b 若 a,b为真,则 a&&b为真,值为 1
a||b 若 a,b之一为真,则 a||b为真,值为 1
!a 若 a为真,则 !a为假,值为 0
a b !b
非 0
非 0
0
0
非 0
0
非 0
0
0
1
1
a&&b a||b
逻辑运算规则表
!a
0
0
0
1
1
1
0
0
0 0
1
1
1
例,
设 x=9,y=3,
则逻辑表达式,x>y&&x!0 的值为 1
逻辑运算注意点:
( 1)参与逻辑运算的量不但可以是 0和 1,或者是 0和非
0的整数,也可以是任何类型的数据,如,字符型,
实型等。
例,‘ A?&&?B?,值为 1
( 2)在处理一个复杂表达式时,对于表达式中不同位置上出现的数值,应区分哪些是作为数值运算或关系运算,哪些作为逻辑运算的对象。
例,x>y&&a||b<=c-!d,值为 1
( 3)在逻辑表达式求解中,并不是所有逻辑运算符都执行,有时只需执行一部分运算就可以得出结果。
例 1,x&&y
a||b||c
例 2,设 a=1,b=2,c=5,d=4,m=n=1,
则 (m=a>b)&&(n=c>d),值为,m=,n=
(m=a>b)||(n=c>d),值为,m=,n=
10 0
01 1
分析,x>y&&a||b<=c-!d/* x=8,y=5,a=2,b=6,c=5,d=0 */
8>5&&2||6<=5-!0
1 &&2||6<=5-!0
1 ||6<=5-!0
0
1 || 0
1
返回第三节 if语句
1,if语句的三种形式
if 语句
if-else 语句
if-else-if 语句
1,if语句的嵌套
if(表达式 1)
else
语句 3;
if(表达式 1)
语句 1;
else
if(表达式 1)
else
语句 1;
语句 2;
语句 1;
语句 2;
if(表达式 2)
语句 1;
else
语句 2; if(表达式 2)
语句 2;
else
语句 3;
if(表达式 1)
语句 1;
else
语句 2;
if(表达式 2)
语句 3;
else
语句 4;
if和 else配对规则,else总是与它前一个最近的 if配对
if
if
if
else
else
else
若要求 else与前面的 if配对,则要用到复合语句。
如,if(表达式 1)
if (表达式 2)语句 1;
else 语句 2;
{ }
如,针对上述情况,分析下面两段程序的功能
1,if(n>0)
if(a>b) z=a;
else z=b;
2,if(n>0)
{if (a>b) z=a;}
else z=b;
/* a=3,b=5,n=2,z=100*/
第四节 条件运算符例,if(x>y)
max=x;
else
max=y;
max=(x>y)?x:y;
一般形式,表达式 1?表达式 2:表达式 3
if
表达式 1
假( 0)真(非 0)
表达式 2的值 表达式 3的值条件运算符说明:
( 1)条件运算符优先级高于赋值运算符,但低于算术运算符、
关系运算符、逻辑运算符。
( 2)条件运算符的结合方向:,自右向左,。
例,a>b?a:c>d?c:d a>b?a:(c>d?c:d)
( 3)表达式 1、表达式 2、表达式 3类型可以不同,条件表达式的值取两者较高的类型。
例,x>y?1:1.5 /*x=2,y=1*/
第五节 switch-case语句
Switch-case语句用于处理多分支结构的条件选择语句,又称,开关语句,。
一般形式,switch( 表达式)
{
case 常量表达式 1,语句 1 ; break;
case 常量表达式 2,语句 2 ; break;
… …
case 常量表达式 n,语句 n ; break;
default,语句 n+1; break;
}
switch
表达式语句 1 语句 n+1语句 2 语句 n
Case
常量表达式 1
Case
常量表达式 2
Case
常量表达式 n
…
…
default
退出 switch,
执行下一个语句注意点:
( 1)各个 case常量表达式不一定按其值的大小顺序排列,但各个 case后的常量表达式必须是不同的值。
例,switch(ch)
{ case?A?:语句 1; break;
case?C?:语句 2; break;
case?B?:语句 3; break;
case?A?:语句 4; break;
default:语句 5;
}
( 2)在 switch-case语句中,多个 case可以共用一条执行语句。
例,……
case?A?:
case?B?:
case?C?,printf(“>60”);break;
……
( 3)若 case后面的语句执行完后没有 break语句,程序将顺序执行下面的 case分支,直到遇到 break语句,跳出 switch-case语句或 switch-case语句结束。
例,……
switch(a>b?1:2) /* a=3,b=6 */
{ case 1,a=100;
case 2,b=a+b;
case 3,a=b+a;
default,b--;
}
printf(“%d,&d\n”,a,b);
结果,12,8
( 4) switch-case语句的嵌套例,#include,stdio.h”
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;
}
printf(“a=&d,b=%d\n”,a,b);
}
结果 a=2,b=1
/*注意该位置没有 break*/
写出下面各表达式的值设 a=10,b=15,c=1,d=2
1,a*b&&c
2,a+b>10||a+b<0
3,1.23&&5.67
4,!0||d&&a==c+d
5,!(x=a)&&(y=b)&&0
6,(a+c==d)==(b+d==a)||(c=b+a)>(d=c+b)
1
1
1
1
0
1
程序举例
1.求一个整数的绝对值。
main()
{
int a;
scanf(“%d”,&a);
if(a<0)
a=-a;
printf(“%d”,a);
}
程序举例
2.输入 2个实数,按代数值由小到大输出。
main()
{
int a,b,t;
scanf(“%d,%d”,&a,&b);
if(a>b)
{
t=a;a=b;b=t;
}
printf(“%d,%d”,a,b);
}
程序举例
3.计算分段函数 y= 的值
x2 –2 x>=0
x x<0
main()
{
float x,y;
scanf(“%f”,&x);
if(x>=0)
y=x*x-2;
else
y=x;
printf(“%.2f”,y);
}
程序举例
4.编写一个程序:要求输入一个学生的考试成绩,
输出其分数和对应的等级。
共分 5个等级:
小于 60分的为,E”;
60~69分为,D”;
70~79分为,C”;
80~89分为,B”;
90分以上的为,A”。
(用 if-else语句)
if(score<60) grade=“E”;
else if(score<70) grade=“D”;
else if(score<80) grade=“C”;
else if(score<90) grade=“B”;
else grade=“A”
程序举例
5.用 switch语句编程,使得如果键入考试等级,就输出百分制分数段:
键入 ‘ A’,输出 85~100;
键入 ‘ B’,输出 70~84;
键入 ‘ C’,输出 60~69;
键入 ‘ D’,输出 <60;
键入其他任意字符,输出 error。
swatch(grade)
{
case,A”:printf(“85~100”);break;
case,B”:printf(“70~84”);break;
case,C”:printf(“60~69”);break;
case,D”:printf(“0~59”);break;
default printf(“error”);
}
格式,if( 表达式)语句 ;
if语句例,if(x>y) printf(“x>y”);
表达式
if
语句 1
真(非 0)
假( 0)
返回
if-else语句格式,if( 表达式)
语句 1 ;
else
语句 2 ; 语句 2
if
表达式假( 0)真(非 0)
语句 1
返回例,if(x>y)
printf(“x>y”);
else
printf(“x<=y”);
if-else-if语句格式,if( 表达式 1)
语句 1 ;
else if (表达式 2)
语句 2 ;
… …
else if (表达式 n-1)
语句 n-1;
else
语句 n ;
if-else-if语句表达式 1
真(非 0)
语句 1
假( 0)
表达式 2
真(非 0)
语句 2
假( 0)
表达式 3
真(非 0)
语句 3
假( 0)
表达式 4
真(非 0)
语句 4
假( 0)
语句 5
返回
即用关系运算符对两个运算量进行比较,比较他们之间的,大小关系,。
例,关系表达式,
y>3
用于判断 y是否大于 3
1.关系运算符及其优先次序运算符 名称 示例
<
<=
>
>=
==
!=
小于小于或等于大于大于或等于等于不等于
a<b
a<=b
a>b
a>=b
a==b
a!=b
示例说明
a小于 b
a小于或等于 b
a大于 b
a大于或等于 b
a等于 b
a不 等于 b
优先次序优先级相同
(高)
优先级相同
(低)
C语言中的关系运算符关于优先次序的说明如下:
( 1)关系、算术、赋值运算符的优先级关系如下:
算术运算符(高) 关系运算符(中) 赋值运算符(低)
( 2)关系运算符的结合方向是,自左向右,
例,
c+d>a+b (c+d)>a+b
a>b!=c (a>b)!=c
a==b<x a==(b<x)
a=b>=c a=(b>=c)
x!=a*b<c x!=((a*b)<c)
2.关系表达式例,
x<y,2*a+b<c-d,(x=2)<=(y=4),?a?<?b?
在 C语言中,关系表达式的结果为 1或 0。
当关系表达式成立时,其结果为 1;
否则值为 0。
例,3<2的值为
5! =81的值为
0
1
例,试求 x=5>3>1 的值分析,x=5>3>1 x=(5>3)>1
=1>1
=0
例,若 a=3,b=4,c=5
则 a>b
a+b>c
f=a<b<c
f=a>b>c 表达式值为表达式值为表达式值为表达式值为 0
0
1
1
第二节 逻辑运算符和逻辑表达式关系表达式只适用于描述单一的条件,
如,x>0用于描述,x大于 0”,对于较复杂的复合条件就需要若干个表等式连接起来才能描述,如,描述,x大于 0且不等于 2”,
就需要将两个表达式 x>0和 x!=2连接起来,
即 x>0&&x!=2,其中,&&”是 C语言中的逻辑运算符。
1.逻辑运算符及其优先次序运算符 名称 示例
!
&&
||
逻辑非逻辑与逻辑或
!a
a&&b
a||b
示例说明
a非
a与 b
a或 b
优先次序高低
C语言中的逻辑运算符关于优先次序的说明如下:
( 1)逻辑运算符的结合方向是,自左向右,。
( 2)
运算符 优先次序
!(非)
算术运算符关系运算符
&&和 ||
赋值运算符高低运算符的优先级例,
(a>b)&&(x>y) a>b&&x>y
(a==b)||(x==y) a==b||x==y
(!a)||(a>b) !a||a>b
2.逻辑表达式一个逻辑表达式中可以包含多个逻辑运算符。
如,x>y&&a<=b-!c
在 C语言中,参与逻辑运算的量为 非零值 或 整数零,非零值 和 整数零 分别表示运算量为,真,或,假,。
C语言编译系统在给出运算结果时,以数值 1代表,真,
以数值 0代表,假,。
例,
a&&b 若 a,b为真,则 a&&b为真,值为 1
a||b 若 a,b之一为真,则 a||b为真,值为 1
!a 若 a为真,则 !a为假,值为 0
a b !b
非 0
非 0
0
0
非 0
0
非 0
0
0
1
1
a&&b a||b
逻辑运算规则表
!a
0
0
0
1
1
1
0
0
0 0
1
1
1
例,
设 x=9,y=3,
则逻辑表达式,x>y&&x!0 的值为 1
逻辑运算注意点:
( 1)参与逻辑运算的量不但可以是 0和 1,或者是 0和非
0的整数,也可以是任何类型的数据,如,字符型,
实型等。
例,‘ A?&&?B?,值为 1
( 2)在处理一个复杂表达式时,对于表达式中不同位置上出现的数值,应区分哪些是作为数值运算或关系运算,哪些作为逻辑运算的对象。
例,x>y&&a||b<=c-!d,值为 1
( 3)在逻辑表达式求解中,并不是所有逻辑运算符都执行,有时只需执行一部分运算就可以得出结果。
例 1,x&&y
a||b||c
例 2,设 a=1,b=2,c=5,d=4,m=n=1,
则 (m=a>b)&&(n=c>d),值为,m=,n=
(m=a>b)||(n=c>d),值为,m=,n=
10 0
01 1
分析,x>y&&a||b<=c-!d/* x=8,y=5,a=2,b=6,c=5,d=0 */
8>5&&2||6<=5-!0
1 &&2||6<=5-!0
1 ||6<=5-!0
0
1 || 0
1
返回第三节 if语句
1,if语句的三种形式
if 语句
if-else 语句
if-else-if 语句
1,if语句的嵌套
if(表达式 1)
else
语句 3;
if(表达式 1)
语句 1;
else
if(表达式 1)
else
语句 1;
语句 2;
语句 1;
语句 2;
if(表达式 2)
语句 1;
else
语句 2; if(表达式 2)
语句 2;
else
语句 3;
if(表达式 1)
语句 1;
else
语句 2;
if(表达式 2)
语句 3;
else
语句 4;
if和 else配对规则,else总是与它前一个最近的 if配对
if
if
if
else
else
else
若要求 else与前面的 if配对,则要用到复合语句。
如,if(表达式 1)
if (表达式 2)语句 1;
else 语句 2;
{ }
如,针对上述情况,分析下面两段程序的功能
1,if(n>0)
if(a>b) z=a;
else z=b;
2,if(n>0)
{if (a>b) z=a;}
else z=b;
/* a=3,b=5,n=2,z=100*/
第四节 条件运算符例,if(x>y)
max=x;
else
max=y;
max=(x>y)?x:y;
一般形式,表达式 1?表达式 2:表达式 3
if
表达式 1
假( 0)真(非 0)
表达式 2的值 表达式 3的值条件运算符说明:
( 1)条件运算符优先级高于赋值运算符,但低于算术运算符、
关系运算符、逻辑运算符。
( 2)条件运算符的结合方向:,自右向左,。
例,a>b?a:c>d?c:d a>b?a:(c>d?c:d)
( 3)表达式 1、表达式 2、表达式 3类型可以不同,条件表达式的值取两者较高的类型。
例,x>y?1:1.5 /*x=2,y=1*/
第五节 switch-case语句
Switch-case语句用于处理多分支结构的条件选择语句,又称,开关语句,。
一般形式,switch( 表达式)
{
case 常量表达式 1,语句 1 ; break;
case 常量表达式 2,语句 2 ; break;
… …
case 常量表达式 n,语句 n ; break;
default,语句 n+1; break;
}
switch
表达式语句 1 语句 n+1语句 2 语句 n
Case
常量表达式 1
Case
常量表达式 2
Case
常量表达式 n
…
…
default
退出 switch,
执行下一个语句注意点:
( 1)各个 case常量表达式不一定按其值的大小顺序排列,但各个 case后的常量表达式必须是不同的值。
例,switch(ch)
{ case?A?:语句 1; break;
case?C?:语句 2; break;
case?B?:语句 3; break;
case?A?:语句 4; break;
default:语句 5;
}
( 2)在 switch-case语句中,多个 case可以共用一条执行语句。
例,……
case?A?:
case?B?:
case?C?,printf(“>60”);break;
……
( 3)若 case后面的语句执行完后没有 break语句,程序将顺序执行下面的 case分支,直到遇到 break语句,跳出 switch-case语句或 switch-case语句结束。
例,……
switch(a>b?1:2) /* a=3,b=6 */
{ case 1,a=100;
case 2,b=a+b;
case 3,a=b+a;
default,b--;
}
printf(“%d,&d\n”,a,b);
结果,12,8
( 4) switch-case语句的嵌套例,#include,stdio.h”
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;
}
printf(“a=&d,b=%d\n”,a,b);
}
结果 a=2,b=1
/*注意该位置没有 break*/
写出下面各表达式的值设 a=10,b=15,c=1,d=2
1,a*b&&c
2,a+b>10||a+b<0
3,1.23&&5.67
4,!0||d&&a==c+d
5,!(x=a)&&(y=b)&&0
6,(a+c==d)==(b+d==a)||(c=b+a)>(d=c+b)
1
1
1
1
0
1
程序举例
1.求一个整数的绝对值。
main()
{
int a;
scanf(“%d”,&a);
if(a<0)
a=-a;
printf(“%d”,a);
}
程序举例
2.输入 2个实数,按代数值由小到大输出。
main()
{
int a,b,t;
scanf(“%d,%d”,&a,&b);
if(a>b)
{
t=a;a=b;b=t;
}
printf(“%d,%d”,a,b);
}
程序举例
3.计算分段函数 y= 的值
x2 –2 x>=0
x x<0
main()
{
float x,y;
scanf(“%f”,&x);
if(x>=0)
y=x*x-2;
else
y=x;
printf(“%.2f”,y);
}
程序举例
4.编写一个程序:要求输入一个学生的考试成绩,
输出其分数和对应的等级。
共分 5个等级:
小于 60分的为,E”;
60~69分为,D”;
70~79分为,C”;
80~89分为,B”;
90分以上的为,A”。
(用 if-else语句)
if(score<60) grade=“E”;
else if(score<70) grade=“D”;
else if(score<80) grade=“C”;
else if(score<90) grade=“B”;
else grade=“A”
程序举例
5.用 switch语句编程,使得如果键入考试等级,就输出百分制分数段:
键入 ‘ A’,输出 85~100;
键入 ‘ B’,输出 70~84;
键入 ‘ C’,输出 60~69;
键入 ‘ D’,输出 <60;
键入其他任意字符,输出 error。
swatch(grade)
{
case,A”:printf(“85~100”);break;
case,B”:printf(“70~84”);break;
case,C”:printf(“60~69”);break;
case,D”:printf(“0~59”);break;
default printf(“error”);
}
格式,if( 表达式)语句 ;
if语句例,if(x>y) printf(“x>y”);
表达式
if
语句 1
真(非 0)
假( 0)
返回
if-else语句格式,if( 表达式)
语句 1 ;
else
语句 2 ; 语句 2
if
表达式假( 0)真(非 0)
语句 1
返回例,if(x>y)
printf(“x>y”);
else
printf(“x<=y”);
if-else-if语句格式,if( 表达式 1)
语句 1 ;
else if (表达式 2)
语句 2 ;
… …
else if (表达式 n-1)
语句 n-1;
else
语句 n ;
if-else-if语句表达式 1
真(非 0)
语句 1
假( 0)
表达式 2
真(非 0)
语句 2
假( 0)
表达式 3
真(非 0)
语句 3
假( 0)
表达式 4
真(非 0)
语句 4
假( 0)
语句 5
返回