第5章 数据类型和表达式(4)

2019-04-13 19:47

C语言提供了3种逻辑运算符(见表5.9所示),逻辑运算对象可以是关系表达式或逻辑量,逻辑运算的结果也是一个逻辑量,与关系运算一样,用整数1代表“真”,用0代表“假”。

表5.9 逻辑运算符

目 数 单 目 双 目 运算符 ! && || 名 称 逻辑非 逻辑与 逻辑或

例如,在逻辑表达式( x >= 3 ) && ( x <= 5 )中,&&是逻辑运算符,关系表达式x >= 3和x <= 5是逻辑运算对象,逻辑运算对象的结果是1或0。

假如a和b是逻辑量,则对a和b可以进行的基本逻辑运算包括 ! a ( 或 ! b )、a && b和a || b 3种。作为逻辑量,a或b的值只能是“真”或“假”,所以,a和b可能的取值组合只有4种,即(“真”,“真”)、(“真”、“假”)、(“假”,“真”)和(“假”,“假”),与之对应的3种逻辑运算的结果也随之确定。将这些内容用一张表格表示,就是逻辑运算的“真值表”,见表5.10所示。它反映了逻辑运算的规则,其中a和b的取值见括号中的内容。

表 5.10 逻辑运算的“真值表”

a b ! a a && b a || b 非 0 (真) 非 0 (真) 0 1 1 非 0 (真) 0 (假) 0 0 1 0 (假) 非 0 (真) 1 0 1 0 (假) 0 (假) 1 0 0 表5.10说明了逻辑运算符的功能,即:

(1)! a :如果a为“真”,结果是0 ( 假 );如果a为“假”,结果是1(真)。 (2)a && b:当a和b都为“真”时,结果是1 ( 真 );否则,结果是0 ( 假 )。 (3)a || b:当a和b都为“假”时,结果是0 ( 假 );否则,结果是1( 真 )。

如何判断逻辑量(如a和b)的真、假呢?如果某个逻辑量的值为非0,就是真;如果值为0就是假(见表5.10所示)。

例如计算(x >= 3)&&(x <= 5),若x = 4,则 x >= 3和 x <= 5的值都是1(非0为真),“逻辑与”运算的结果就是1;若x = 10,则x >= 3的值是1(非0为真),而 x <= 5的值是0(假),“逻辑与”运算的结果就是0。 又如,计算 ! ( x = = 2 ),若x = 10,则x = = 2的值是0(假),“逻辑非”运算的结果是1(真);若x = 2,则 x = = 2的值是1(非0为真),“逻辑非”运算的结果是0(假)。

逻辑运算符的优先级见表5.6。例如: (1)a || b && c等价于a || ( b && c ) (2)! a && b等价于( ! a ) && b

(3)x >= 3 && x <= 5等价于( x >= 3 ) && ( x <= 5) (4)! x == 2等价于( ! x ) == 2

(5)a || 3 + 10 && 2等价于a || (( 3 + 10 ) && 2 ) 2、逻辑表达式

16

用逻辑运算符将关系表达式或逻辑量连接起来的式子,称为逻辑表达式。逻辑运算对象是值为“真”或“假”的逻辑量,它可以是任何类型的数据,如整型、浮点型、字符型等,C编译系统以非0和0判定真和假。逻辑表达式的值反映了逻辑运算的结果,也是一个逻辑量,但系统在给出逻辑运算结果时,用1代表真,0代表假。 例5.8 逻辑表达式的运用

#include int main()

{ char ch = 'w';

int a = 2,b = 0,c = 0; float x = 3.0;

printf(\ // 有一个假,则为假,结果是0

printf(\//按优先级先&&后||,则b&&c为假0,a||0有一个真为真,结果真1 printf(\// 按优先级先!后&&,则!a是假,再&&b( 0),假与假还是假0 printf(\//a||3是真,以后无论是假还是真,结果都是1,因为真1+1或0是真1 printf(\// x= =2是假,非( ! )假( 0 )是真1 printf(\// !x是假0,0 = = 2是假0

printf(\ // w 的ASCII码十进制为119为非0真1,真1或( || )假,还是真1 return 0;

}

运行结果:0 1 0 1 1 0 1

程序中字符型变量ch的值是?w?(其ASCII码值不为0),整型变量a的值是2,浮

点型变量x的值是3.0,都是非0的数,在逻辑运算时,相当于“真”,整型变量b和c的值都是0,在逻辑运算时,相当于“假”,而逻辑运算的结果只能是1或0。

!( x = = 2 )是逻辑表达式,当x = 3.0时,( x = = 2 )的值是0,再计算 ! 0,得1。而 ! x = = 2是关系表达式,等价于( ! x ) = = 2,当x = 3.0时,! x的值是0,再计算0 = = 2,得到0。其实,无论x取什么值,逻辑表达式 ! x的值不是1就是0,而不可能等于2,即 ! x = = 2的值恒为0。

与其它表达式的运算过程不同,求解用逻辑运算符&&或者 || 连接的逻辑表达式时,按从左到右的顺序计算该运算符两侧的操作数,一旦能得到表达式的结果,就停止计算。例如:

(1)求解逻辑表达式exp1 && exp2时,先计算exp1,若其值为0,则exp1 && exp2的值一定是0。此时,已经没有必要计算exp2的值。例5.8中,计算表达式 ! a && b时,先算 ! a,由于a的值是2,! a就是0,该逻辑表达式的值一定是0,不必再计算b。 (2)求解逻辑表达式exp1 || exp2时,先算exp1,若其值为非0,则exp1 || exp2的值一定是1。此时,也不必计算exp2的值。例5.8中,计算表达式a || 3 + 10 && 2时,先算a,由于a的值是2,该逻辑表达式的值一定是1,也不必再计算3 + 10 && 2。 例5.9 写出满足下列条件的C表达式 (1)x 为零 (2)x和y不同时为零 解答(1)关系表达式x = = 0或逻辑表达式 ! x

当x分别取值非0和0时,从真值表5.11可以看出,两个表达式的结果相同,故两

17

式等价。

5.11(1) 真 值 表 x x = = 0 ! x

非0 0 0 0 1 1

解答(2)逻辑表达式 ! ( x = = 0 && y = = 0 )或 x ! = 0 || y ! = 0或 x || y

从5.11(2)真值表上可以看出,3个表达式的结果相同,故3者等价。

5.11(2)真值表 x y !(x==0&&y==0) x!=0||y!=0 x||y

非0 非0 1 1 1 非0 0 1 1 1 0 非0 1 1 1 0 0 0 0 0

5.5.5 条件表达式

条件运算符是C语言中的一个三目运算符,它将3个表达式连接在一起,组成条件表达式。条件表达式的一般形式是: 表达式1?表达式2:表达式3;

条件表达式的运算过程是:先计算表达式1的值,如果它的值为非0(真),将表达式2的值作为条件表达式的值,否则,将表达式3的值作为条件表达式的值。 例如,设a、b是整型变量,将a、b的最大值赋给z,可以用if语句实现: if ( a > b ) z = a ; else

z = b ;

也可以用条件表达式求出a、b的最大值,再赋给z ; z = ( a > b ) ? a : b ;

如果条件表达式中表达式2和表达式3的类型不同,根据5.4.1节中讨论的类型自动转换规则确定条件表达式的类型。例如,表达式 ( n > 0 ) ? 2.9 : 1的类型是double型。如果n是一个浮数,该表达式的值是1.0,而不是1。

条件运算符的优先级较低,只比赋值运算符高。它的结合方向是自右向左(见表5.6所示)。例如:

(1)( n > 0 ) ? 2.9 : 1等价于n > 0 ? 2.9 : 1

(2)a > b ? a : c > d ? c : d等价于a > b ? a : ( c > d ? c : d ) 灵活地使用条件表达式,不但可以使C语言程序简单明了,而且还能提高运算效率。

5.5.6 逗号表达式

C语言中,逗号既可以作为分隔符,又可作为运算符。逗号作为分隔符使用时,用于间隔说明语句中的变量或函数中的参数,例如:

18

int a,b,c;

printf(“%d %d”,x,y);

逗号作为运算符使用时,将若干个独立的表达式连接在一起,组成逗号表达式。逗号表达式的一般形式是: 表达式1,表达式2,…,表达式 n

逗号表达式的运算过程是:先计算表达式1的值,然后计算表达式2的值,…,最后计算表达式n的,并将表达式n的值作为逗号表达式的值,将表达式n的类型作为逗号表达式的类型。

例如,设a,b,c都是整型变量,计算逗号表达式” ( a = 2 ),( b = 3 ),( c = a + b ) ”的值,该表达式由3个独立的表达式通过逗号运算符连接而成,从左到右依次求解这3个表达式后,该逗号表达式的值和类型由最后一个表达式” c = a + b “决定,其值是5,类型是整型。

逗号运算符的优先级是所有运算符中最低的,它的结合性是从左到右(见表5.6所示)。例如:表达式” ( a = 2 ),( b = 3 ),( c = a + b ) “等价于” a = 2,b = 3,c = a + b”。

逗号表达式常用于for循环语句中。

5.5.7 位运算

位运算是C语言与其它高级语言相比较,一个比较有特色的地方,利用位运算可以实现许多汇编语言才能实现的功能。

所谓位运算是指进行二进制位的运算。C语言提供的位运算符如表5.12所示。

表5.12 位 运 算 符

运算符 名 称 & 按位“与” | 按位“或” ∧ 按位“异或” ~ 取 反 << 左 移 >> 右 移

在使用位运算符时,注意以下几点:

(1)位运算符中除 ~ 是单目运算以外,其余均为二目运算

(2)位运算符所操作的操作数只能是整型或字符型的数据以及它们的变体 (3)操作数的移位运算不改变原操作数的值

C语言的位运算符分为位逻辑运算符和移位运算符两类。下面将分别介绍各个位运算符。

1、位逻辑运算符

位逻辑运算符有如下4种,二进制位逻辑运算的真值表见表5.13所示。

表5.13 二进制位逻辑运算真值表

A B ~A A | B A & B A ∧ B

19

0 0 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 1 1 1 0 1 1 0

(1)单目运算符:~ ( 取反 )

(2)双目运算符:& ( 按位 “ 与 “ )、| ( 按位 “或” )、∧ ( 按位”异或”)

位逻辑运算符的运算规则:先将两个操作数(int或char类型)化为二进制数,然后按位运算。

例如,位非运算~,将操作数按二进制数逐位求反,即1变为0,0变为1。

设a = 84,b = 59,则a & b结果为16。因为84的二进制数为01010100,而59的二进制数为00111011,按上表的运算规则逐位求与,得二进制数00010000,即是十进制数16。具体过程如下:

01010100(十进制84的二进制数) & ) 00111011(十进制59的二进制数) 00010000(十进制16的二进制数)

注意,二进制位逻辑运算和普通的逻辑运算的区别。假设 x = 0,y = 28,则x & y等于0,x | y 等于28,而x && y等于0,x || y等于1。在做位运算时,只有对应位进行运算,相邻位之间没有关系。

对于位“异或”运算∧有几个特殊的操作: (1)a ∧ a的值为0

(2)a ∧ ~a = 二进制全1(如果a以16位二进制数表示,则为65535) (3)~( a ∧ ~a ) = 0

除此以外,位“异或”运算∧还有一个很特别的应用,即通过使用位“异或”运算而不虚临时变量就可以交换两个变量的值。假设a = 19,b = 23,想将a和b的值互换,可执行语句: a ∧ = b ∧ = a ∧ = b ;该语句等效于下述两步: b ∧ = a ∧ = b ; a = a ∧ b ;

b ∧ = a ∧ = b可解释为:b = b ∧ ( a ∧ b ) a ∧ b ∧ b a ∧ 0 = a 因为操作数的位运算并不改变原操作数的值,除第一个b外,其余的a、b都是指原来的a、b,即b得到a原来的值。

a = a ∧ b可解释为:

a = a ∧ b ( a ∧ b ) ∧ ( b ∧ a ∧ b ) a ∧ a ∧ b ∧ b ∧ b = b 最初两步之一的“ b ∧ = a ∧ = b;” 中 “ a ∧ = b”使a改变,b也已经改变,分别将原来的式子代入最后的a = a ∧ b,a得到b原来的值。 2、移位运算

移位运算是指对操作数以二进制位为单位进行左移或右移的操作。移位运算有两种: >> (右移) 和 << (左移)。

a >> b表示将a的二进制值右移b位,a << b表示将a的二进制值左移b位。要求a和b都是整型,b只能为正数,且不能超过机器字所表示的二进制位数。

20


第5章 数据类型和表达式(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:省级机关事业单位在职无房职工住房补贴申请表

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: