如果有以下赋值表达式:
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)
&&
和||”是“双目(元)运算符”,它要求有两个运算量(操作数),
如(
a>b)&&
x>y)
(a>b)||(x>y)。
“!
”是“一目(元)运算符”,只要求有一
个运算量,
如!
(a>b)
逻辑运算举例如下:
a&&ba||b
!
a
若a,b为真,则a&&b为真。
若a,b之一为真,则a||b为真。
若a为真,则!
a为假。
下表为逻辑运算的
的值。
真值表”。
用它表示当a和b的值为不冋组合时,各种逻辑运算所得到
ab!
a!
ba&&ba||b
TTFFTT
TF
FT
FF在一个逻辑表达式中如果包含多个逻辑运算符,如
!
a&&b||x>y&&c
优先次序:
高t低
!
t算术运算符t关系运算符t&&t||t赋值运算符
!
a&&b||x>y&&c(a>b)&&(x>y)(a==b)||(x==y)(!
a)||(a>b)
((!
a)&&b)||((x>y)&&c)
可写成:
a>b&&x>y可写成:
a==b||x>y可写成:
!
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-!
0
表达式自左至右扫描求解。
首先处理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>b)&&(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
elseif
(表达式3)
语句3
elseif
(表达式m)
语句m
else
语句n
流程图
例如。
if(number>500)cost
=0.15;
elseif
(number>300)
cost=0.
10:
elseif
(number>100)
cost=0
.075;
elseif
(number>50)
cost=
0.05;
else
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');
执行结果:
输岀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>a&&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