《第3~4讲 第2章运算符和表达式》由会员分享,可在线阅读,更多相关《第3~4讲 第2章运算符和表达式(53页珍藏版)》请在金锄头文库上搜索。
1、华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计C 语言程序设计语言程序设计主讲主讲: : 蒋蒋 明明Email:jm_Email:jm_Tel: 65023599Tel: 65023599光信光信20102010级、中法班级、中法班( ( 2011.2-2011.7) )光信光信0901-04 0901-04 光信光信0801-04 0801-04 光信光信0702-04 0702-04 光电光电0601-03 0601-03 光电光电0501-030501-032010.3-2010.7 2009.2-2
2、008.62010.3-2010.7 2009.2-2008.6 2008.2-2008.7 2007.3-2007.7 2006.3-2008.2-2008.7 2007.3-2007.7 2006.3-2006.72006.7华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计标准标准C C语言程序设计及应用语言程序设计及应用 周纯杰、刘正林等编著周纯杰、刘正林等编著华中科技大学出版社华中科技大学出版社20052005年第年第1 1版版,2008,2008年第年第2 2次印刷次印刷 教学课本教学课本: 参考书
3、参考书: :C C语言大全语言大全赫伯特赫伯特. .希尔特著希尔特著 王子恢等译王子恢等译Herbert Herbert SchildtSchildt 电子工业出版社电子工业出版社 2000.32000.3 C C程序设计程序设计 谭浩强谭浩强 著著清华大学出版社清华大学出版社最新最新C C语言程序设计教程语言程序设计教程刘正林等编著刘正林等编著 华中科技华中科技 大学出版社大学出版社2006.62006.6C C语言与习题解答语言与习题解答 李春葆李春葆 著著 清华大学出版社清华大学出版社后续课程:面向对象程序设计、数据结构、操作系统、后续课程:面向对象程序设计、数据结构、操作系统、计算机组
4、成原理计算机组成原理, VC+ 6.0, VC+ 6.0编程等编程等华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计C语言丰富的数据类型语言丰富的数据类型 前一讲回顾前一讲回顾华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计第讲第讲 运算符和表达式运算符和表达式华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计语言中运算符分类语言中运算符分类
5、“运算符运算符”是描述各种不同运算操作的符号。是描述各种不同运算操作的符号。按照运算功能分类按照运算功能分类: : 、算术运算符;、赋值运算符;、关系运算符;、算术运算符;、赋值运算符;、关系运算符; 、逻辑运算符;、位运算符;、自增自减运算符;、逻辑运算符;、位运算符;、自增自减运算符;、条件运算符;、逗号运算符。、条件运算符;、逗号运算符。按参与运算的运算量数目分类按参与运算的运算量数目分类:、单目运算符、双目运算符、三目运算符;、单目运算符、双目运算符、三目运算符; i+; i+; a+ba+b ab ? ab ? a:ba:b华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院
6、华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计表达式表达式表达式表达式: :由运算符和运算量组成的符合由运算符和运算量组成的符合C C语法规则的算式。语法规则的算式。 ( (运算量可以是变量、常量、有返回值的函数等运算量可以是变量、常量、有返回值的函数等) ) 例:例: a*11; a*11; a&ba&b; a=b; ; a=b; a+ba+b; a; f=count(); a; f=count(); C C语言中的表达式根据运算符的种类可以分为:语言中的表达式根据运算符的种类可以分为: 算术表达式、关系表达式、逻辑表达式、算术表达式、关系表达式、逻辑表达式、 赋
7、值表达式、条件表达式、逗号表达式赋值表达式、条件表达式、逗号表达式 混合表达式等。混合表达式等。 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计、 算术运算符算术运算符与算术表达式与算术表达式、 关系运算符关系运算符与关系表达式与关系表达式、 逻辑运算符逻辑运算符与逻辑表达式与逻辑表达式、 自增和自减运算符自增和自减运算符和表达式和表达式、 赋值运算符赋值运算符与赋值表达式与赋值表达式、 条件运算符条件运算符与条件表达式与条件表达式、 逗号运算符逗号运算符与逗号表达式与逗号表达式 8、 位运算符位运算符与位
8、运算表达式与位运算表达式语言中运算符及表达式语言中运算符及表达式华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计1 1、算术运算符与算术表达式、算术运算符与算术表达式C C语言中,算术运算符有语言中,算术运算符有5 5个,它们的具体含义见下表个,它们的具体含义见下表 :运算符运算符使用形式使用形式含义含义 +单目或双目运单目或双目运算符算符单目运算表示正号,双目运算表示单目运算表示正号,双目运算表示加法运算加法运算 -单目或双目运单目或双目运算符算符单目运算表示负,双目运算表示减单目运算表示负,双目运算表示减
9、法运算法运算 *双目运算符双目运算符乘法运算乘法运算 /双目运算符双目运算符除法运算除法运算 %双目运算符双目运算符整数取模运算(求余数)整数取模运算(求余数)华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计算术运算符的使用规则算术运算符的使用规则(1) +、-、*、/运算符的运算量可为整型或浮点型数据(包运算符的运算量可为整型或浮点型数据(包括常量、变量、有返回值的函数以及表达式)。括常量、变量、有返回值的函数以及表达式)。 (2) 取模运算符取模运算符%要求运算量必须是整型,且要求运算量必须是整型,且%后
10、面的运算量后面的运算量不能为不能为0。(3) 除法运算除法运算x/y中,表达式中,表达式y的取值不能为的取值不能为0。(4) 当双目运算符的两个运算量的类型相同时,它们的运算当双目运算符的两个运算量的类型相同时,它们的运算结果的类型与运算量类型相同。例结果的类型与运算量类型相同。例:16 / 7 结果为整型结果为整型2,小数部分被省去,小数部分被省去16 / 5.0 结果为实型结果为实型3.2 (5) 当双目运算符的两个运算量的类型不同时,运算前遵循当双目运算符的两个运算量的类型不同时,运算前遵循类型的一般转换规则将运算量自动转换成值域较宽的相同类型的一般转换规则将运算量自动转换成值域较宽的相
11、同类型。类型。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计数据类型自动转换遵循如下图所示规则数据类型自动转换遵循如下图所示规则:(1)表达式中的字符型以及短整型一律被转换为整型,如果表达式中的字符型以及短整型一律被转换为整型,如果int类类型能表示原来类型的值,则转换成型能表示原来类型的值,则转换成int类型,否则转换成类型,否则转换成unsigned类型。类型。(2) 当一个运算量为当一个运算量为long类型,另一个为类型,另一个为unsigned类型时,如果类型时,如果long能表示能表示unsign
12、ed的全部值,则将的全部值,则将unsigned转换成转换成long,否,否则将两个运算量都转换为则将两个运算量都转换为unsigned long。(3) 当两个运算量中值域较宽的类型是当两个运算量中值域较宽的类型是float类型时,不再将类型时,不再将float和另一运算量转成和另一运算量转成float类型类型,直接转换为直接转换为double型。型。数据类型自动转换规则(数据类型自动转换规则(page35 图图2.2)华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例如:例如:float f = 3.6;
13、int n = 6;long k = 21;double ss = f * n + k / 2; double double long double double 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计赋值运算时的自动类型转换赋值运算时的自动类型转换 将将 赋值运算符赋值运算符“=”右子表达式结果的类型转成左侧右子表达式结果的类型转成左侧变量的数据类型。变量的数据类型。 (赋值转换具有强制性,转换结果的类型完全由左侧变量的类型决定)例:int i,j;float m; i = m * j;表达式表达
14、式i = m * ji = m * j的类型转换过程为:的类型转换过程为: 计算表达式计算表达式m*jm*j时进行自动类型转换时进行自动类型转换 右侧的表达式的值为右侧的表达式的值为doubledouble类型,类型, 赋值给赋值给intint型变量型变量i i时按舍去小数部分进行处理时按舍去小数部分进行处理。注:对于注:对于printf(“%.2f”,m*j);时,是按四舍五入进行输出时,是按四舍五入进行输出 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计强制类型转换强制类型转换 强制类型转换是靠强制类型
15、转换运算符来实现数强制类型转换是靠强制类型转换运算符来实现数据类型转换的,其目的是将表达式转换成据类型转换的,其目的是将表达式转换成“类型名类型名”所指定的类型。也称为显式转换所指定的类型。也称为显式转换 。 表达式形式:表达式形式: (类型名类型名) 表达式表达式例例: float a=1.2; int b; b=(int)a*6; /结果为结果为6 b=(int)(a*6); /结果为结果为7 (注意:注意:自动类型转换和强制类型转换都只是将变量或常量的自动类型转换和强制类型转换都只是将变量或常量的值的类型进行暂时的转换,用于参与运算和操作,值的类型进行暂时的转换,用于参与运算和操作,而变
16、量内而变量内存中的数值并没有改变存中的数值并没有改变。)华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例例2.4 五种算术运算示例五种算术运算示例#include void main() int x, y; float x1, y1; x = 15; y = 6; x1 = 15.0; y1 = 6.0; printf(x = %d , y = %dn, x, y); printf(x + y = %dn, x + y); printf(x y = %dn, x - y); printf(x * y = %
17、dn, x * y); printf(x / y = %d.%dn, x / y, x % y); printf(x1 / y1 = %f n, x1 / y1);运行结果为:运行结果为:x = 15 , y = 6x + y = 21x y = 9x * y = 90x / y = 2.3x1 / y1 = 2.500000 example2-4.c华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例例: : 3 % 5 结果为结果为3-17 % 5 结果为结果为-220 % 10 结果为结果为0常用常用%与
18、与/结合应用,来求某数的各位数字:结合应用,来求某数的各位数字: int a=123; b=a%10 得到个位数得到个位数 3 a/10%10 得到十位数得到十位数 2 a/100%10 得到百位数得到百位数1华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2 2、关系运算符与关系表达式、关系运算符与关系表达式关系运算符是用来比较两个运算量之间的大小关系的双目运算符,通常关系运算符是用来比较两个运算量之间的大小关系的双目运算符,通常用来作为条件分支语句执行的判断条件。运算结果为用来作为条件分支语句执行的判断条
19、件。运算结果为0或者或者1. 关系表达关系表达式成立时,表达式的结果为整数式成立时,表达式的结果为整数1,否则为整数,否则为整数0 。 C语言中的语言中的6个关系运算符包括:个关系运算符包括: ( (小于小于) ) = = = ( (大于或等于大于或等于) ) ( (大于大于) ) != != ( (不等于不等于) ) 用关系运算符将前、后两个运算量连接起来的式子称为用关系运算符将前、后两个运算量连接起来的式子称为“关系表达式关系表达式”,这两个运算量可以是任意表达式。,这两个运算量可以是任意表达式。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序
20、设计语言程序设计语言程序设计语言程序设计例例2.5 关系表达式的值关系表达式的值#include void main( ) char ch1,ch2; ch1 = a; ch2 = b; printf(%c = %c-%dn,ch1,ch2,ch1 = ch2); printf(%c %c-%dn,ch1,ch2,ch1 %c-%dn,ch1,ch2,ch1 ch2); printf(%c = %c-%dn,ch1,ch2,ch1 = %c-%dn,ch1,ch2,ch1 = ch2); printf(%c != %c-%dn,ch1,ch2,ch1 != ch2);运行结果为:运行结果为:a
21、 = b-0 a b-0 a = b-0 a != b-1华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计C语言中的语言中的3个逻辑运算符个逻辑运算符包括:包括:1. & (逻辑与逻辑与) a&b2. | | (逻辑或逻辑或) a |b 3. ! (逻辑非逻辑非) ! a逻辑与、逻辑或是双目运算符,逻辑非是单目运算符。逻辑与、逻辑或是双目运算符,逻辑非是单目运算符。逻辑运算符及运算量所构成的表达式称为逻辑运算符及运算量所构成的表达式称为逻辑表达式逻辑表达式。在在C语言中,语言中,0代表逻辑假,非代表逻辑假,非
22、0值代表逻辑真。值代表逻辑真。逻逻辑表达式运算结果为:假(辑表达式运算结果为:假(0)或)或 真(真(1)。)。3 3、逻辑运算符与逻辑表达式、逻辑运算符与逻辑表达式华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计逻辑运算符的运算规则见下表逻辑运算符的运算规则见下表 : :/*x&(a=a+b)运算中:当运算中:当x的结果为的结果为0时,不再运算表达式时,不再运算表达式2*/*x|(a=a+b)运算中:当运算中:当x的结果为非的结果为非0时,不再运算表达式时,不再运算表达式2*/ 表达式表达式X 表达式表达式
23、Y !X !Y X&Y X|Y非非0非非0 0 0 11非非00 0 1 010非非0 1 00100 1 1 00华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例例2.6 逻辑运算符逻辑运算符&的使用的使用#include void main( ) int a , b , c , max; a = 10; b = 20; max = b; c = ( a b ) & ( max = a ) ; /*(ab)结果为结果为0 不再运算右表达式不再运算右表达式(max=a) */ printf(a = %d ,
24、 b = %d , c = %d , max = %dn,a,b,c,max); c = ( a b)的结果为的结果为1时,不再运算右表达式时,不再运算右表达式(max=a) */ printf(a = %d , b = %d , c = %d , max = %dn,a,b,c,max); 运行结果为:运行结果为:a = 10 , b = 20 , c = 0 , max = 20 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计运算符的优先级运算符的优先级C语言将语言将44个运算符分为个运算符分为15个优
25、先级,个优先级,1级最高,级最高,2级次之,级次之,以此类推,以此类推,15级最低。同一表达式中优先级高的运算符先执级最低。同一表达式中优先级高的运算符先执行运算。行运算。运算符的结合性是指当一个运算对象两侧的运算符优先级相运算符的结合性是指当一个运算对象两侧的运算符优先级相同时,两运算符进行运算处理的先后顺序。同时,两运算符进行运算处理的先后顺序。结合方向分为:结合方向分为:从左向右、从右向左从左向右、从右向左。 例例 : a*b+c a/b*c表表2.8列出了列出了C语言中运算符优先级和结合性。(见语言中运算符优先级和结合性。(见page46)华中科技大学信息学院华中科技大学信息学院华中科
26、技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例例: int x,y,z;z= y=-x+2 & !x; 表达式中各运算符的优先顺序由高到低为:表达式中各运算符的优先顺序由高到低为:“!”、“-”(负号运算符)(负号运算符)“+”(加法运算符)(加法运算符)“=”“&”“=”。表达式等价于:表达式等价于:z=(y=(-x+2) &(!x)。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计自增、自减运算符分别为自增、自减运算符分别为: + (自增自增1) - (自减自减
27、1) +和和- 各有两种不同的形式和意义:各有两种不同的形式和意义: 前置式:前置式: +i、-i 后置式:后置式: i+、i-都是表示对变量都是表示对变量i进行增进行增1或减或减1操作操作, 即即: +i和和i+ 都等价于都等价于i=i+1 i-和和 i都等价于都等价于i=i-1;4 4、 自增和自减运算符自增和自减运算符华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计“+”-”运算符的使用运算符的使用:(1)前置运算前置运算是变量先自增是变量先自增1或自减或自减1后后,再参与表达式中其他的再参与表达式中其
28、他的运算运算,即先增即先增(减减)1后计算;后计算;例如例如:x = 0 ; y = - x + x; x = 0 ; y = x- + x; (2) 后置运算后置运算是该变量先以原来的值参加其它运算,然后再自增是该变量先以原来的值参加其它运算,然后再自增1或自减或自减1,即先计算后增即先计算后增(减减)1;例如:例如:x = 10 ; y = x+ + x; (3) 自增自减运算符自增自减运算符只能作用于变量只能作用于变量,不能用于常量和表达式。,不能用于常量和表达式。 计算后为计算后为x=-1,y=-2计算后为计算后为x=-1,y=0结果为结果为x = 11 , y =20;x = 10
29、; y = +x + x+; 结果为结果为?x = 10 ; y = -x + -x; 结果为结果为?华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例例2.7 自增自减运算符的运算自增自减运算符的运算#include void main( ) int x,y; x = 0; y = 10; /*变量变量x先输出值,再自增,变量先输出值,再自增,变量y先自增先自增,再输出值再输出值 */ printf(x = %d , y = %dn, x + , - y); printf(x = %d , y = %dn,
30、 x , y); 运行结果为:运行结果为:x = 0 , y = 9 x = 1 , y = 9example2-7.c华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计(1). 基本赋值运算基本赋值运算 基本赋值运算符基本赋值运算符“=”是一个双目运算符是一个双目运算符,它它的一般表达式形式为:的一般表达式形式为: 左值表达式左值表达式 = 右值表达式右值表达式例例: int i,j; char m,n; float x,y; double zj = i i和和j的类型相同的类型相同,无需转换无需转换,直接将
31、直接将i的值赋给的值赋给ji = m m由由char型向型向int型转换,将转换后的值赋给型转换,将转换后的值赋给iz = x * i x * i的结果为的结果为double型,然后赋值给型,然后赋值给zi = m n m n的结果为整型,无需转换,直接将值赋给的结果为整型,无需转换,直接将值赋给ii = j = 10 多重赋值表达式,赋值运算符按从右至左结合,即相多重赋值表达式,赋值运算符按从右至左结合,即相 当于当于i=(j=10),先将先将10赋给赋给j, 赋值表达式(赋值表达式(j=10)的值)的值 就是赋值后的就是赋值后的j的值的值,再将其赋给再将其赋给i5、 赋值运算符与赋值表达式
32、赋值运算符与赋值表达式华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计(2). 复合赋值运算符复合赋值运算符 在赋值运算符在赋值运算符“=”前加上其他运算符构成。前加上其他运算符构成。复合赋值表达式的形式为:复合赋值表达式的形式为: 左值表达式左值表达式 op = 右值表达式右值表达式C语言中的复合赋值运算符共有语言中的复合赋值运算符共有10种种: +=、-=、*=、/=、%=、&=、|=、=、=。例如:例如:i += j 等价于等价于 i = i + jx *= y - 5 等价于等价于 x = x * (
33、y-5)m = 2 等价于等价于 m = m 2华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计条件运算符条件运算符( ? : )是是C语言中唯一的一个三目运算符语言中唯一的一个三目运算符.使用形式:使用形式: 表达式表达式1 ? 表达式表达式2 : 表达式表达式3运算过程:运算过程:先计算表达式先计算表达式1的值;的值;如果表达式如果表达式1的值为非的值为非0,则求解表达式,则求解表达式2的值,并将的值,并将其作为整个条件表达式的值;其作为整个条件表达式的值;如果表达式如果表达式1的值为的值为0,则求解表达
34、式,则求解表达式3的值,并将其的值,并将其作为该条件表达式的值。作为该条件表达式的值。6 6、 条件运算符与条件表达式条件运算符与条件表达式华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计例例2.8 条件运算符的使用条件运算符的使用#include void main( ) int a,b,c; a = 10; b = -5; c = a b ? a : b; printf(a = %d,b = %d, max = %dn,a,b,c); 运行结果为:运行结果为:a = 10,b = -5,max=10华中科
35、技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计 逗号运算符是双目运算符,优先级逗号运算符是双目运算符,优先级15,逗号表达式形式为:,逗号表达式形式为: 表达式表达式1 , 表达式表达式2 , 表达式表达式3, , 表达式表达式n; 运算过程:先求表达式运算过程:先求表达式1的值,然后再求表达式的值,然后再求表达式2的值,依的值,依次计算下去,次计算下去,最后表达式最后表达式n的值也就是整个逗号表达式的值的值也就是整个逗号表达式的值。 例例: int b, a=10; b = a+ , a % 3 计算过程:先求
36、表达式计算过程:先求表达式 b=a+的值,结果为的值,结果为10,计算,计算a + ,此时,此时a的值为的值为11;然后求表达式;然后求表达式 a%3的值为的值为2。整个逗号表达式的值为整个逗号表达式的值为2。 表达式表达式 a=(b = a+ , a % 3); 计算结果为计算结果为 a=2;7、 逗号运算符与逗号表达式逗号运算符与逗号表达式华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计8、位运算(、位运算(int或或char型数据)型数据)通常的运算符是对一个数据整体值进行操作,位运通常的运算符是对一个
37、数据整体值进行操作,位运算提供了对数据对象在内存中的位(算提供了对数据对象在内存中的位(bit)进行操)进行操作。作。位运算符操作对象为整型或字符型数据。位运算符操作对象为整型或字符型数据。 8.1 按位与运算符按位与运算符“&”8.2 按位或运算符按位或运算符“|”8.3 按位异或运算符按位异或运算符“” 8.4 二进制左移运算符二进制左移运算符“”8.6 按位取反运算符按位取反运算符“”华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计8.1 按位与运算符按位与运算符“&” 按位与运算是对两个操作数按二进制
38、按位与运算是对两个操作数按二进制bitbit位位“求与求与”, ,当当两数对应位都为两数对应位都为1 1时时, ,结果的对应位为结果的对应位为1,1,否则为否则为0 0。与运算符。与运算符的定义如下表所示的定义如下表所示: : 位1 位2 位1&位2 0 0 0 0 1 0 1 0 0 1 1 1例如:a=0x96,b=0x80, a 1001 0110则a&b的结果为0x80 b 1000 0000 结果 1000 0000华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计按位与的作用:按位与的作用:(1)(
39、1)将某些位清零将某些位清零如要将某端口控制的一组二极管中的某些发光二极管如要将某端口控制的一组二极管中的某些发光二极管熄灭,实际上是将某个控制数的对应位清零,如熄灭,实际上是将某个控制数的对应位清零,如a=0x55,a=0x55,要将要将a a的低四位清零,那就要将的低四位清零,那就要将a a与一个与一个低四位为零其它位为低四位为零其它位为1 1的数进行按位与运算。的数进行按位与运算。运算过程:运算过程:运算的结果是对象数据的低四位清运算的结果是对象数据的低四位清0 0,其它不变。,其它不变。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语
40、言程序设计语言程序设计语言程序设计(2)取数中的特定位取数中的特定位 与上述操作相反,在实际操作中通常要求保持某些位的与上述操作相反,在实际操作中通常要求保持某些位的状态,如状态,如a=0x55,要保持要保持a的低四位,其它位清零,那就的低四位,其它位清零,那就要将要将a与一个低四位为与一个低四位为1其它位为其它位为0的数进行按位与运算。的数进行按位与运算。运算过程:运算过程:运算的结果是对象数据的低四位不变,其它清运算的结果是对象数据的低四位不变,其它清0华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计8.
41、2 按位或运算符按位或运算符“|”按位或运算是对两个操作数逐位按位或运算是对两个操作数逐位“相或相或”。当它们都是。当它们都是0的的时候时候,结果为结果为0,否则为否则为1。下表为位逻辑或操作的下表为位逻辑或操作的“真值表真值表” 位位1 位位2 位位1|位位2 0 0 0 0 1 1 1 0 1 1 1 1例如例如:a=0x36,b=0x55,则则a | b的结果为的结果为0x77华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计按位或按位或运算运算: :华中科技大学信息学院华中科技大学信息学院华中科技大学信
42、息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计按位或的作用按位或的作用 (1)(1)将数的某些位置将数的某些位置1 1如要将某端口控制的某些发光二极管点亮,实际上是将某个如要将某端口控制的某些发光二极管点亮,实际上是将某个控制数的对应位置控制数的对应位置1 1,如,如a=0x55,a=0x55,要将要将a a的低四位清零,那的低四位清零,那就要将就要将a a与一个数进行按位或运算,这个数的低四位为与一个数进行按位或运算,这个数的低四位为1 1其它位为其它位为0 0。运算过程如下:运算过程如下:运算的结果是对象数据的低四位置运算的结果是对象数据的低四位置1 1其
43、它不变其它不变华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计(2)把一串二进制数连接到另一串二进制数后把一串二进制数连接到另一串二进制数后 实际应用中有时也需要将一串二进制数连接到另一串二进制实际应用中有时也需要将一串二进制数连接到另一串二进制数后,如通讯中的数后,如通讯中的CRC校验。校验。处理方式:先在对象字符串的末尾加上处理方式:先在对象字符串的末尾加上N个零然后与连接的字符个零然后与连接的字符串进行按位或操作。串进行按位或操作。如如a=0x55,要连接的数据为要连接的数据为8位二进制串,表示成十六进
44、制为位二进制串,表示成十六进制为0xaa;则首先将则首先将a的后面加的后面加8个个0;变成;变成0x5500,然后与然后与0xaa按按位或。运算过程如下:位或。运算过程如下:华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计8.3 按位异或运算符按位异或运算符“”按位异或运算是将两个操作数逐位按位异或运算是将两个操作数逐位“相异或相异或”,即对应位相异时结果为即对应位相异时结果为1,否则为否则为0。下表为下表为 位逻辑异或操作的位逻辑异或操作的“真值表真值表” 位位1 1 位位2 2 位位1 1位位2 2 0
45、0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计异或运算异或运算: : 规律:某位要保持不变规律:某位要保持不变 就异或就异或0 0,某位要取反就异或,某位要取反就异或1 1。可用异或运算来对数据进行加密和解密。可用异或运算来对数据进行加密和解密。 example2-9.c 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计8.4 8.4
46、 二进制左移运算符二进制左移运算符“”二进制左移二进制左移: 把数据向左移动把数据向左移动n位位,移出左边界的所有位都将丢失移出左边界的所有位都将丢失, 不论正负数右侧新增加的位为不论正负数右侧新增加的位为0。例:例:int a = 4 ; a 2的结果为的结果为16因为变量因为变量a在内存中为在内存中为: 0000 0000 00000100,左移两位在右端补左移两位在右端补0后后: 0000 0000 00010000,对应结果为对应结果为16。 a=-4; 表达式子表达式子 a1111 1011 1111 1100 1111 1000 11110111 1000 1000规律:在数据值符
47、号位不改变的情况下规律:在数据值符号位不改变的情况下向左移动向左移动n位等于乘上位等于乘上2的的n次方。次方。 若若: a=4; a”二进制右移运算把数据向右移动若干位二进制右移运算把数据向右移动若干位,移出右边界的位将丢移出右边界的位将丢失失,左侧的新位的补充遵循下面的规则:左侧的新位的补充遵循下面的规则:(1) 对于无符号数对于无符号数,右移时左侧的新位一律补右移时左侧的新位一律补0,称为称为“逻辑右逻辑右移移”(2) 对于有符号数对于有符号数,若符号位是若符号位是0,则左侧新位一律补则左侧新位一律补0;若符号;若符号位是位是1,则左侧新位补则左侧新位补1,称为称为“算术右移算术右移”例如
48、例如, a=8,其二进制表示为其二进制表示为00001000,右移两位右移两位,左侧新位补左侧新位补0后结果为后结果为00000010,a2的结果为的结果为2。 a=-11,其二进制表示为其二进制表示为11110101右移右移1位位,左侧新位补左侧新位补1后结果为后结果为11111010,a1的结果为的结果为-6。向右移动向右移动n位等于除以位等于除以2的的n次方次方 example2-9.c华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计8.6 按位取反运算符按位取反运算符“”按位取反运算符是将操作数进行逐
49、位按位取反运算符是将操作数进行逐位“取反取反”。例如例如: 变量变量char a=0x6a,二进制表示为,二进制表示为01101010,按位取反后为按位取反后为10010101,所以,所以a的结果为的结果为0x95。 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2.7 常见问题分析常见问题分析1. 数据的溢出问题数据的溢出问题数据有其固定的表示范围,因此当数据有其固定的表示范围,因此当数据的值超出了其范围时,将数据的值超出了其范围时,将出现溢出问题。出现溢出问题。例例2.9 整型数溢出整型数溢出 #inc
50、lude void main( ) short a,b; a = 32767; b = a + 1; printf(%d,%dn,a,b);在上面这段程序中在上面这段程序中,变量变量a的值为的值为32767,它在内存中的表示为它在内存中的表示为:a:0111 1111 1111 1111当当a加上加上1后后,内存中的表示为内存中的表示为:1000 0000 0000 0000它的实际十进制值为它的实际十进制值为 -32768,与,与我们希望的我们希望的32768的值不符,这的值不符,这就是因为溢出问题而产生的错就是因为溢出问题而产生的错误,在程序编写过程中需要注误,在程序编写过程中需要注意避免
51、。意避免。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计2. 无符号整数与有符号整数混合运算数据类型自动转换问题无符号整数与有符号整数混合运算数据类型自动转换问题例例2.10 无符号整型数与有符号整型数混合运算出错无符号整型数与有符号整型数混合运算出错#include void main( ) int x = 1; unsigned int y = 2; printf(x - y = %d , (x - y)/2 = %d n,x - y , (x - y)/2);输出结果为:输出结果为:x y = -1
52、, (x - y)/2 = 32767按照常理,我们认为按照常理,我们认为(1 - 2)/2结果应该为结果应该为-0.5,截去小数后,截去小数后,结果应为结果应为0,但事实上并非如此,而是得到结果,但事实上并非如此,而是得到结果32767。(example2-10.c)华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计变量变量x,y的值分别为的值分别为1和和2,它在内存中它在内存中(标准标准16bit)的表示为的表示为:x: 0000 0000 0000 0001y: 0000 0000 0000 0010执行
53、执行x y操作后,根据操作后,根据C语言中的类型自动转换原则,计算语言中的类型自动转换原则,计算结果的类型应为无符号整型数,其结果在内存中存放形式结果的类型应为无符号整型数,其结果在内存中存放形式为:为:x y: 1111 1111 1111 1111如果将如果将x y的结果以有符号整型数形式输出,因的结果以有符号整型数形式输出,因x -y的最高的最高位为位为1,输出结果为,输出结果为-1。如果将。如果将(x y)/2其结果在内存中的其结果在内存中的存放形式为:存放形式为:(x y)/2: 0111 1111 1111 1111以有符号数的形式输出,正好为以有符号数的形式输出,正好为32767
54、。而不是我们按常理。而不是我们按常理应得到的数字应得到的数字0。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计3. 浮点型变量的舍入误差问题浮点型变量的舍入误差问题例例2.11 实型数据的舍入误差实型数据的舍入误差#include void main( ) float x , y; x = 1.0; y = x / 3 * 3; printf(x = %f , y = %f n, x , y);输出结果为:输出结果为:x = 1.000000 , y = 0.999999建议:如果在表达式中出现除法运算符建
55、议:如果在表达式中出现除法运算符“/”时,建议将时,建议将“/”尽量往后放。在一定程度上可以提高计算结果的精尽量往后放。在一定程度上可以提高计算结果的精度。度。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计4.书写标识符时,忽略了大小写字母的区别书写标识符时,忽略了大小写字母的区别 例例2.12 标识符大小写引起的问题标识符大小写引起的问题#include void main( ) int a=5; printf(%d,A); 编译程序把编译程序把a和和A认为是两个不同的变量名,而显示认为是两个不同的变量名
56、,而显示出错信息。出错信息。C认为大写字母和小写字母是两个不同认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小的字符。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。写表示,以增加可读性。 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计5.scanf,printf函数中格式符与数据类型的一致性函数中格式符与数据类型的一致性,以以及运算符对数据类型的要求及运算符对数据类型的要求 、变量名称大小写。、变量名称大小写。例例2.13 格式符要严格与数据类型一致格式符要严格与数据
57、类型一致#include void main( ) int a=5; float b=1,c=2; printf(%f,A); a=b%c; 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计6.将字符常量与字符串常量混淆将字符常量与字符串常量混淆char c; c=a; 字符常量是由一对单引号括起来的单个字符。字符常量是由一对单引号括起来的单个字符。字符串常量是一对双引号括起来的字符序列。字符串常量是一对双引号括起来的字符序列。C规定以规定以“0”作字符串结束标志,它是由系作字符串结束标志,它是由系统自动加上
58、的,所以字符串统自动加上的,所以字符串“a”实际上包实际上包含两个字符:含两个字符:a和和0 。 华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计7.忽略了忽略了“=”与与“=”的区别的区别 “=”是赋值运算符是赋值运算符 “= =”是关系运算符。是关系运算符。初学者常常会在书写程序时无意中混淆二者。初学者常常会在书写程序时无意中混淆二者。如下例,该语句本意是要检查如下例,该语句本意是要检查a是否和是否和4相等:相等: if (a = 4) a = b; 实际上是将实际上是将4赋值给了赋值给了a,然后检查表达
59、式的结果是,然后检查表达式的结果是否为否为0,这样,最终的结果始终是把,这样,最终的结果始终是把b值赋给了值赋给了a。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计第第3讲小结讲小结本讲主要内容:本讲主要内容:延续第延续第2讲内容,讲述了讲内容,讲述了C语言的基语言的基本语法单位:本语法单位:8类运算符及表达式。要求结合上类运算符及表达式。要求结合上一讲的数据类型及其存储特点等相关知识,熟练一讲的数据类型及其存储特点等相关知识,熟练掌握运算符的功能、运算量的要求以及运算过程掌握运算符的功能、运算量的要求以及
60、运算过程中的数据类型转换规则。中的数据类型转换规则。下一讲:下一讲:将进入将进入C语言结构化编程的学习,掌握语言结构化编程的学习,掌握3种种基本流程结构(顺序、选择、循环)基本流程结构(顺序、选择、循环) C语言编程语言编程设计的方法,并应用于解决典型编程问题。设计的方法,并应用于解决典型编程问题。华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院华中科技大学信息学院C C语言程序设计语言程序设计语言程序设计语言程序设计第1章:3,4,6第2章:第一大题第三大题 第四大题要求:抄写原题目并写出结果课后作业课后作业(数据类型(数据类型,运算符及运算符及scanf,printf函数是函数是C语言的入门基础)语言的入门基础)