[其它]第34讲 第2章运算符和表达式.ppt

上传人:仙人指路1688 文档编号:2416097 上传时间:2023-02-18 格式:PPT 页数:53 大小:383KB
返回 下载 相关 举报
[其它]第34讲 第2章运算符和表达式.ppt_第1页
第1页 / 共53页
[其它]第34讲 第2章运算符和表达式.ppt_第2页
第2页 / 共53页
[其它]第34讲 第2章运算符和表达式.ppt_第3页
第3页 / 共53页
[其它]第34讲 第2章运算符和表达式.ppt_第4页
第4页 / 共53页
[其它]第34讲 第2章运算符和表达式.ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《[其它]第34讲 第2章运算符和表达式.ppt》由会员分享,可在线阅读,更多相关《[其它]第34讲 第2章运算符和表达式.ppt(53页珍藏版)》请在三一办公上搜索。

1、C 语言程序设计,主讲:蒋 明Email:jm_Tel:65023599光信2010级、中法班(2011.2-2011.7)光信0901-04 光信0801-04 光信0702-04 光电0601-03 光电0501-032010.3-2010.7 2009.2-2008.6 2008.2-2008.7 2007.3-2007.7 2006.3-2006.7,标准C语言程序设计及应用 周纯杰、刘正林等编著华中科技大学出版社2005年第1版,2008年第2次印刷,教学课本:,参考书:C语言大全赫伯特.希尔特著 王子恢等译Herbert Schildt 电子工业出版社 2000.3 C程序设计 谭

2、浩强 著清华大学出版社最新C语言程序设计教程刘正林等编著 华中科技 大学出版社2006.6C语言与习题解答 李春葆 著 清华大学出版社后续课程:面向对象程序设计、数据结构、操作系统、计算机组成原理,VC+6.0编程等,C语言丰富的数据类型 前一讲回顾,第讲 运算符和表达式,语言中运算符分类,“运算符”是描述各种不同运算操作的符号。按照运算功能分类:、算术运算符;、赋值运算符;、关系运算符;、逻辑运算符;、位运算符;、自增自减运算符;、条件运算符;、逗号运算符。按参与运算的运算量数目分类:、单目运算符、双目运算符、三目运算符;i+;a+b ab?a:b,表达式,表达式:由运算符和运算量组成的符合

3、C语法规则的算式。(运算量可以是变量、常量、有返回值的函数等)例:a*11;a C语言中的表达式根据运算符的种类可以分为:算术表达式、关系表达式、逻辑表达式、赋值表达式、条件表达式、逗号表达式 混合表达式等。,、算术运算符与算术表达式、关系运算符与关系表达式、逻辑运算符与逻辑表达式、自增和自减运算符和表达式、赋值运算符与赋值表达式、条件运算符与条件表达式、逗号运算符与逗号表达式 8、位运算符与位运算表达式,语言中运算符及表达式,1、算术运算符与算术表达式,C语言中,算术运算符有5个,它们的具体含义见下表:,算术运算符的使用规则(1)+、-、*、/运算符的运算量可为整型或浮点型数据(包括常量、变

4、量、有返回值的函数以及表达式)。(2)取模运算符%要求运算量必须是整型,且%后面的运算量不能为0。(3)除法运算x/y中,表达式y的取值不能为0。(4)当双目运算符的两个运算量的类型相同时,它们的运算结果的类型与运算量类型相同。例:16/7 结果为整型2,小数部分被省去16/5.0 结果为实型3.2(5)当双目运算符的两个运算量的类型不同时,运算前遵循类型的一般转换规则将运算量自动转换成值域较宽的相同类型。,数据类型自动转换遵循如下图所示规则:,(1)表达式中的字符型以及短整型一律被转换为整型,如果int类型能表示原来类型的值,则转换成int类型,否则转换成unsigned类型。(2)当一个运

5、算量为long类型,另一个为unsigned类型时,如果long能表示unsigned的全部值,则将unsigned转换成long,否则将两个运算量都转换为unsigned long。(3)当两个运算量中值域较宽的类型是float类型时,不再将float和另一运算量转成float类型,直接转换为double型。,数据类型自动转换规则(page35 图2.2),例如:float f=3.6;int n=6;long k=21;double ss=f*n+k/2;double double long double double,赋值运算时的自动类型转换 将 赋值运算符“=”右子表达式结果的类型转成

6、左侧变量的数据类型。(赋值转换具有强制性,转换结果的类型完全由左侧变量的类型决定)例:int i,j;float m;i=m*j;表达式i=m*j的类型转换过程为:计算表达式m*j时进行自动类型转换 右侧的表达式的值为double类型,赋值给int型变量i时按舍去小数部分进行处理。注:对于printf(“%.2f”,m*j);时,是按四舍五入进行输出,强制类型转换 强制类型转换是靠强制类型转换运算符来实现数据类型转换的,其目的是将表达式转换成“类型名”所指定的类型。也称为显式转换。表达式形式:(类型名)表达式例:float a=1.2;int b;b=(int)a*6;/结果为6 b=(int

7、)(a*6);/结果为7(注意:自动类型转换和强制类型转换都只是将变量或常量的值的类型进行暂时的转换,用于参与运算和操作,而变量内存中的数值并没有改变。),例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=%dn,x*y);printf(x/y=%d.%dn,x/y,x%y);printf(x1/y1=%f n,x1/y1);运行结果为:x=1

8、5,y=6x+y=21x y=9x*y=90 x/y=2.3x1/y1=2.500000 example2-4.c,例:3%5 结果为3-17%5 结果为-220%10 结果为0常用%与/结合应用,来求某数的各位数字:int a=123;b=a%10 得到个位数 3 a/10%10 得到十位数 2 a/100%10 得到百位数1,2、关系运算符与关系表达式,关系运算符是用来比较两个运算量之间的大小关系的双目运算符,通常用来作为条件分支语句执行的判断条件。运算结果为0或者1.关系表达式成立时,表达式的结果为整数1,否则为整数0。C语言中的6个关系运算符包括:=(大于或等于)(大于)!=(不等于)

9、用关系运算符将前、后两个运算量连接起来的式子称为“关系表达式”,这两个运算量可以是任意表达式。,例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 ch2);printf(%c=%c-%dn,ch1,ch2,ch1=ch2);printf(%c!=%c-%dn,ch1,ch2,ch1!=ch2);运行结果为:a=b-0 a b-0 a=b-0 a!=b-1,C语言中的3个逻辑运算符包括:&(逻辑与)a&b|(逻

10、辑或)a|b!(逻辑非)!a逻辑与、逻辑或是双目运算符,逻辑非是单目运算符。逻辑运算符及运算量所构成的表达式称为逻辑表达式。在C语言中,0代表逻辑假,非0值代表逻辑真。逻辑表达式运算结果为:假(0)或 真(1)。,3、逻辑运算符与逻辑表达式,逻辑运算符的运算规则见下表:/*x&(a=a+b)运算中:当x的结果为0时,不再运算表达式2*/*x|(a=a+b)运算中:当x的结果为非0时,不再运算表达式2*/,例2.6 逻辑运算符 运行结果为:a=10,b=20,c=0,max=20,运算符的优先级,C语言将44个运算符分为15个优先级,1级最高,2级次之,以此类推,15级最低。同一表达式中优先级高

11、的运算符先执行运算。运算符的结合性是指当一个运算对象两侧的运算符优先级相同时,两运算符进行运算处理的先后顺序。结合方向分为:从左向右、从右向左。例:a*b+c a/b*c表2.8列出了C语言中运算符优先级和结合性。(见page46),例:int x,y,z;z=y=-x+2&!x;表达式中各运算符的优先顺序由高到低为:“!”、“-”(负号运算符)“+”(加法运算符)“=”“&”“=”。表达式等价于:z=(y=(-x+2)&(!x)。,自增、自减运算符分别为:+(自增1)-(自减1)+和-各有两种不同的形式和意义:前置式:+i、-i 后置式:i+、i-都是表示对变量i进行增1或减1操作,即:+i

12、和i+都等价于i=i+1 i-和 i都等价于i=i-1;,4、自增和自减运算符,“+”-”运算符的使用:(1)前置运算是变量先自增1或自减1后,再参与表达式中其他的运算,即先增(减)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;y=+x+x+;结果为?x=10;y=-x+-x;结果为?,例2.7 自增自减运算符的运

13、算#include void main()int x,y;x=0;y=10;/*变量x先输出值,再自增,变量y先自增,再输出值*/printf(x=%d,y=%dn,x+,-y);printf(x=%d,y=%dn,x,y);运行结果为:x=0,y=9 x=1,y=9example2-7.c,(1).基本赋值运算 基本赋值运算符“=”是一个双目运算符,它的一般表达式形式为:左值表达式=右值表达式例:int i,j;char m,n;float x,y;double zj=i i和j的类型相同,无需转换,直接将i的值赋给ji=m m由char型向int型转换,将转换后的值赋给iz=x*i x*i

14、的结果为double型,然后赋值给zi=m n m n的结果为整型,无需转换,直接将值赋给ii=j=10 多重赋值表达式,赋值运算符按从右至左结合,即相 当于i=(j=10),先将10赋给j,赋值表达式(j=10)的值 就是赋值后的j的值,再将其赋给i,5、赋值运算符与赋值表达式,(2).复合赋值运算符 在赋值运算符“=”前加上其他运算符构成。复合赋值表达式的形式为:左值表达式 op=右值表达式C语言中的复合赋值运算符共有10种:+=、-=、*=、/=、%=、&=、|=、=、=。例如:i+=j 等价于 i=i+jx*=y-5 等价于 x=x*(y-5)m=2 等价于 m=m 2,条件运算符(?

15、:)是C语言中唯一的一个三目运算符.使用形式:表达式1?表达式2:表达式3运算过程:先计算表达式1的值;如果表达式1的值为非0,则求解表达式2的值,并将其作为整个条件表达式的值;如果表达式1的值为0,则求解表达式3的值,并将其作为该条件表达式的值。,6、条件运算符与条件表达式,例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,逗号运算符是双目运算符,优先级15,逗号表达式形式为:表达式1,表达式2,表达式3,表

16、达式n;运算过程:先求表达式1的值,然后再求表达式2的值,依次计算下去,最后表达式n的值也就是整个逗号表达式的值。例:int b,a=10;b=a+,a%3 计算过程:先求表达式 b=a+的值,结果为10,计算a+,此时a的值为11;然后求表达式 a%3的值为2。整个逗号表达式的值为2。表达式 a=(b=a+,a%3);计算结果为 a=2;,7、逗号运算符与逗号表达式,8、位运算(int或char型数据),通常的运算符是对一个数据整体值进行操作,位运算提供了对数据对象在内存中的位(bit)进行操作。位运算符操作对象为整型或字符型数据。8.1 按位与运算符“&”8.2 按位或运算符“|”8.3

17、按位异或运算符“”8.4 二进制左移运算符“”8.6 按位取反运算符“”,8.1 按位与运算符“&”,按位与运算是对两个操作数按二进制bit位“求与”,当两数对应位都为1时,结果的对应位为1,否则为0。与运算符的定义如下表所示:,例如:a=0 x96,b=0 x80,a 1001 0110则a&b的结果为0 x80 b 1000 0000 结果 1000 0000,按位与的作用:(1)将某些位清零如要将某端口控制的一组二极管中的某些发光二极管熄灭,实际上是将某个控制数的对应位清零,如a=0 x55,要将a的低四位清零,那就要将a与一个低四位为零其它位为1的数进行按位与运算。运算过程:运算的结果

18、是对象数据的低四位清0,其它不变。,(2)取数中的特定位 与上述操作相反,在实际操作中通常要求保持某些位的状态,如a=0 x55,要保持a的低四位,其它位清零,那就要将a与一个低四位为1其它位为0的数进行按位与运算。运算过程:运算的结果是对象数据的低四位不变,其它清0,8.2 按位或运算符“|”,按位或运算是对两个操作数逐位“相或”。当它们都是0的时候,结果为0,否则为1。下表为位逻辑或操作的“真值表”,例如:a=0 x36,b=0 x55,则a|b的结果为0 x77,按位或运算:,按位或的作用(1)将数的某些位置1如要将某端口控制的某些发光二极管点亮,实际上是将某个控制数的对应位置1,如a=

19、0 x55,要将a的低四位清零,那就要将a与一个数进行按位或运算,这个数的低四位为1其它位为0。运算过程如下:运算的结果是对象数据的低四位置1其它不变,(2)把一串二进制数连接到另一串二进制数后 实际应用中有时也需要将一串二进制数连接到另一串二进制数后,如通讯中的CRC校验。处理方式:先在对象字符串的末尾加上N个零然后与连接的字符串进行按位或操作。如a=0 x55,要连接的数据为8位二进制串,表示成十六进制为0 xaa;则首先将a的后面加8个0;变成0 x5500,然后与0 xaa按位或。运算过程如下:,8.3 按位异或运算符“”,按位异或运算是将两个操作数逐位“相异或”,即对应位相异时结果为

20、1,否则为0。下表为 位逻辑异或操作的“真值表”,异或运算:,规律:某位要保持不变 就异或0,某位要取反就异或1。可用异或运算来对数据进行加密和解密。example2-9.c,8.4 二进制左移运算符“”,二进制左移:把数据向左移动n位,移出左边界的所有位都将丢失,不论正负数右侧新增加的位为0。例:int a=4;a 1111 1011 1111 1100 1111 1000 11110111 1000 1000规律:在数据值符号位不改变的情况下向左移动n位等于乘上2的n次方。若:a=4;a13 为:1000 0000 00000000=-32768(指BC3.1中,VC中int占用32bit

21、s,因此还是65536),8.5 二进制右移运算符“”,二进制右移运算把数据向右移动若干位,移出右边界的位将丢失,左侧的新位的补充遵循下面的规则:(1)对于无符号数,右移时左侧的新位一律补0,称为“逻辑右移”(2)对于有符号数,若符号位是0,则左侧新位一律补0;若符号位是1,则左侧新位补1,称为“算术右移”例如,a=8,其二进制表示为00001000,右移两位,左侧新位补0后结果为00000010,a2的结果为2。a=-11,其二进制表示为11110101右移1位,左侧新位补1后结果为11111010,a1的结果为-6。向右移动n位等于除以2的n次方 example2-9.c,8.6 按位取反

22、运算符“”,按位取反运算符是将操作数进行逐位“取反”。例如:变量char a=0 x6a,二进制表示为01101010,按位取反后为10010101,所以a的结果为0 x95。,2.7 常见问题分析,1.数据的溢出问题数据有其固定的表示范围,因此当数据的值超出了其范围时,将出现溢出问题。例2.9 整型数溢出#include 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

23、0000它的实际十进制值为-32768,与我们希望的32768的值不符,这就是因为溢出问题而产生的错误,在程序编写过程中需要注意避免。,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,(x-y)/2=32767按照常理,我们认为(1-2)/2结果应该为-0.5,截去小数后,结果应为0,但事实上并非如此,而是得到结果32767。(example2-

24、10.c),变量x,y的值分别为1和2,它在内存中(标准16bit)的表示为:x:0000 0000 0000 0001y:0000 0000 0000 0010执行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。而不是我们按常理应得到的数字0。,3.浮点型变量的舍入误差问题

25、例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建议:如果在表达式中出现除法运算符“/”时,建议将“/”尽量往后放。在一定程度上可以提高计算结果的精度。,4.书写标识符时,忽略了大小写字母的区别 例2.12 标识符大小写引起的问题#include void main()int a=5;printf(%d,A);编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名

26、用大写,变量名用小写表示,以增加可读性。,5.scanf,printf函数中格式符与数据类型的一致性,以及运算符对数据类型的要求、变量名称大小写。例2.13 格式符要严格与数据类型一致#include void main()int a=5;float b=1,c=2;printf(%f,A);a=b%c;,6.将字符常量与字符串常量混淆char c;c=a;字符常量是由一对单引号括起来的单个字符。字符串常量是一对双引号括起来的字符序列。C规定以“0”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符:a和0。,7.忽略了“=”与“=”的区别“=”是赋值运算符“=”是关系

27、运算符。初学者常常会在书写程序时无意中混淆二者。如下例,该语句本意是要检查a是否和4相等:if(a=4)a=b;实际上是将4赋值给了a,然后检查表达式的结果是否为0,这样,最终的结果始终是把b值赋给了a。,第3讲小结,本讲主要内容:延续第2讲内容,讲述了C语言的基本语法单位:8类运算符及表达式。要求结合上一讲的数据类型及其存储特点等相关知识,熟练掌握运算符的功能、运算量的要求以及运算过程中的数据类型转换规则。下一讲:将进入C语言结构化编程的学习,掌握3种基本流程结构(顺序、选择、循环)C语言编程设计的方法,并应用于解决典型编程问题。,第1章:3,4,6第2章:第一大题第三大题 第四大题要求:抄写原题目并写出结果,课后作业(数据类型,运算符及scanf,printf函数是C语言的入门基础),

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号