逻辑运算和判断选取控制Word文档格式.docx
《逻辑运算和判断选取控制Word文档格式.docx》由会员分享,可在线阅读,更多相关《逻辑运算和判断选取控制Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
![逻辑运算和判断选取控制Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/25/40c336e9-6cd4-4f62-98c9-4a14ca56f759/40c336e9-6cd4-4f62-98c9-4a14ca56f7591.gif)
例如,优先于==”。
而、”与2”优先级相同。
2.关系运算符的优先级低于算术运算符。
3.关系运算符的优先级高于赋值运算符。
高T低
算术运算符关系运算符赋值运算符
例如:
c>
a+b等效于c>
(a+b)
a>
b!
=c等效于(a>
b)!
=c
a==b<
c等效于a==(b<
c)
4.1.2关系表达式
用关系运算符将两个表达式(可以是算术表达式或关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称关系表达式。
例如,下面都是合法的关系表达式:
b,a+b>
b+c,(a=3)>
(b=5),'
a'
v'
b'
,(a>
b)>
(b<
c)
关系表达式的值是一个逻辑值,即真”或假”例如,关系表达式5=3”的值为假”5>
=0”的值
为真”C语言没有逻辑型数据(Pascal语言以True表示真”,以False表示假”。
PASCA和FORTRAN等语言都有逻辑型变量和逻辑型常量),以1代表真”,以0”代表假”。
例如,若a=3,b=2,c=1,
则:
b的值为”真”,表达式的值为1。
(a>
b)==c的值为真”(因为a>
b的值为1,等于c的值),表达式的值为1。
b+c<
a的值为假”,表达式的值为0。
如果有以下赋值表达式:
d=a>
bd的值为1。
f=a>
b>
cf的值为0(因为>
"
运算符是自左至右的结合方向,先执行a>
b"
得值为1,再
执行关系运算:
“>
c”得值0,赋给f
4.2逻辑运算符和逻辑表达式
用逻辑运算符将关系表达式或逻辑量连接起来就是逻辑表达式。
下面介绍C语言中的逻辑运算符和逻辑运算。
4.2.1逻辑运算符及其优先次序
C语言提供三种逻辑运算符:
1.
&
逻辑与(相当于其它语言中的AND)
2.
||逻辑或(相当于其它语言中的OR)
3.
!
逻辑非(相当于其它语言中的NOT)
和||”是“双目(元)运算符”,它要求有两个运算量(操作数),
如(
b)&
x>
y)
(a>
b)||(x>
y)。
“!
”是“一目(元)运算符”,只要求有一
个运算量,
如!
b)
逻辑运算举例如下:
a&
ba||b
!
a
若a,b为真,则a&
b为真。
若a,b之一为真,则a||b为真。
若a为真,则!
a为假。
下表为逻辑运算的
的值。
真值表”。
用它表示当a和b的值为不冋组合时,各种逻辑运算所得到
ab!
a!
ba&
TTFFTT
TF
FT
FF在一个逻辑表达式中如果包含多个逻辑运算符,如
a&
b||x>
y&
c
优先次序:
高t低
t算术运算符t关系运算符t&
t||t赋值运算符
c(a>
b)&
(x>
y)(a==b)||(x==y)(!
a)||(a>
((!
a)&
b)||((x>
y)&
可写成:
a>
b&
y可写成:
a==b||x>
!
a||a>
b
4.2.2逻辑表达式
如前所述,逻辑表达式的值应该是一个逻辑量真”或’假”。
C语言编译系统在给出逻辑运算结
果时,以数值1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。
即将一个非零的数值认作为“真”。
1若a=4,则!
a的值为0。
因为a的值为非0,被认作真”,对它进行非”运算,得假”,假”以0代表。
2若a=4,b=5,则a&
t的值为1。
因为a和b均为非0,被认为是真”,因此a&
t的值也为真”,值为1。
3a、b值同前,a||b的值为1。
4a、b值同前,!
a||b的值为1。
54&
0||2的值为1。
通过这几个例子可以看出,由系统给出的逻辑运算结果不是0就是1,不可能是其它数值。
而
在逻辑表达式中作为参加逻辑运算的运算对象(操作数)可以是0(“假”)或任何非0的数值(按“真”对待)。
如果在一个表达式中不同位置上出现数值,应区分哪些是作为数值运算或关系运算的对象,
哪些作为逻辑运算的对象,
例如
5>
3&
2||8V4-!
表达式自左至右扫描求解。
首先处理5>
3”(因为关系运算符优先于&
)。
在关系运算符两侧的5
和3作为数值参加关系运算,”5>
3”的值为:
1。
再进行”1&
2”的运算,此时1和2均是逻辑运算对象,均作“真”处理,因此结果为1。
再往下进行“1||8<
4-!
0”的运算。
根据优先次序,先进行“!
0”运算得1,因此,要运算的表达式变成:
“1||8V4-1”,即“1||8<
3”,关系运算符V”两侧的8和3
作为数值参加比较,‘8<
3”的值为0(假”)。
最后得到“||0”的结果1。
实际上,逻辑运算符两侧的运算对象不但可以是0和1,或者是0和非0的整数,也可以是任何类型的数据。
可以是字符型、实型或指针型等。
系统最终以0和非0来判定它们属于“真”或“假”。
例
如
‘c'
'
d'
的值为1(因为’c'
和’d'
的Ascii值都不为0,按真”处理)。
在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。
1.a&
b&
c只有a为真(非0)时,才需要判别b的值,只有a和b都为真的情况下才需
要判别c的值。
只要a为假,就不必判别b和c,(此时整个表达式已确定为假)。
如果a为真,b为假,
不判别c。
2.a||b||c只要a为真(非0)就不必判别b和c
对&
运算符只有a工0,才继续进行右面的运算。
对||运算符来说,只有a=0才继续进行其右面的运算。
因此,如果有下面的逻辑表达式:
(m=a>
(n=c>
d)
当a=1,b=2,c=3,d=4,m和n的原值为1时,由于a>
b的值为0,m=0而n=c>
d不被执行,因此n的值不是0而仍保持原值1。
这点请读者注意。
熟练掌握C语言的关系运算符和逻辑运算符后,可以巧妙地用一个逻辑表达式来表示一个复
杂的条件。
例如,判别某一年year是否闰年。
闰年的条件是符合下面二者之一:
①能被4整除,但不能
被100整除。
②能被4整除,又能彼400整除。
可以用一个逻辑表达式来表示:
year%4==0&
year%100!
=0||year%400==0
当year为某一整数值时,上述表达式值为真
(1),则year为闰年;
否则为非闰年。
可以加一个“!
”用来判别非闰年:
(year%4==0&
year%100!
=0||year%400==0)
若表达式值为真
(1),year为非闰年。
也可以用下面逻辑表达式判别非闰年:
(year%4!
=0)||(year%100==0||year%400!
=0)
表达式为真,year为非闰年。
请注意表达式中右面的括弧内的不同运算符(%,!
,&
、==)
的运算优先次序。
4.3if语句
if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。
4.3.1if语句的三种形式
C语言提供了三种形式的if语句:
1.if(表达式)语句
if(x>
y)printf(”%d”,x)这种if语句的执行过程见图
2.if(表达式)语句1else语句2例如:
if(x>
y)printf(”%d”,x);
elseprintf(”%d”,y);
见图
.if
(表达式1)
语句1
elseif
(表达式2)
语句2
(表达式3)
语句3
(表达式m)
语句m
else
语句n
流程图
例如。
if(number>
500)cost
=0.15;
(number>
300)
cost=0.
10:
100)
cost=0
.075;
50)
cost=
0.05;
cost
0;
说明:
三种形式的if语句中在if后面都有“表达式”,
一般为逻辑表达式或关系表达式。
例如,
if(a==b&
.x==y)printf(”a=b,x=y”);
系统对表达式的值进行判断,若为0,按“假”处理,若为非0,按“真”处理,执行指定的语句。
假如有以下语句:
if(3)printf(“ok.”);
是合法的,执行结果输岀”ok”。
因为表达式的值为3,按真”处理。
由此可见,表达式的类型不限于逻辑表达式,可以是任意的数值类型(包括整型、实型、字符型、指针型数据)。
例如,下面的语句也是合法的:
if('
a'
)printf(”%d”,'
);
执行结果:
输岀a的Ascii码97。
2.第二、第三种形式的讨语句中,在每个else前面有一分号,整个语句结束处有一分号。
if(x>
0)printf(“%f”,x);
elseprintf(“%f”,-x);
这是由于分号是C语句中不可缺少的部分,这个分号是让语句中的内卧语句所要求的。
如果无此分号,则岀现语法错误。
但应注意,不要误认为上面是两个语句(if语句
和else语句)。
它们都属于同一个if语句。
else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。
3•在if和else后面可以只含一个内嵌的操作语句(如上例),也可以有多个操作语句,此时用花括号“{}”将几个语句括起来成为一个复合语句。
如:
if(a+b>
c&
b+c>
c+a>
b)
{s=0.5*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("
area=%6.2f”,area);
}
elseprintf(”itisnotatrilateral”);
注意在{}外面不需要再加分号。
因为{}内是一个完整的复合语句,不需另附加分号。
例4