![[其它]第34讲 第2章 运算符和表达式.ppt_第1页](http://file.renrendoc.com/FileRoot1/2019-1/22/cba65fe1-7d06-4aed-8527-39e2007a5bed/cba65fe1-7d06-4aed-8527-39e2007a5bed1.gif)
![[其它]第34讲 第2章 运算符和表达式.ppt_第2页](http://file.renrendoc.com/FileRoot1/2019-1/22/cba65fe1-7d06-4aed-8527-39e2007a5bed/cba65fe1-7d06-4aed-8527-39e2007a5bed2.gif)
![[其它]第34讲 第2章 运算符和表达式.ppt_第3页](http://file.renrendoc.com/FileRoot1/2019-1/22/cba65fe1-7d06-4aed-8527-39e2007a5bed/cba65fe1-7d06-4aed-8527-39e2007a5bed3.gif)
![[其它]第34讲 第2章 运算符和表达式.ppt_第4页](http://file.renrendoc.com/FileRoot1/2019-1/22/cba65fe1-7d06-4aed-8527-39e2007a5bed/cba65fe1-7d06-4aed-8527-39e2007a5bed4.gif)
![[其它]第34讲 第2章 运算符和表达式.ppt_第5页](http://file.renrendoc.com/FileRoot1/2019-1/22/cba65fe1-7d06-4aed-8527-39e2007a5bed/cba65fe1-7d06-4aed-8527-39e2007a5bed5.gif)
已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
c 语言程序设计,主讲: 蒋 明 email:jm_ tel: 65023599 光信2010级、中法班( 2011.2-2011.7) 光信0901-04 光信0801-04 光信0702-04 光电0601-03 光电0501-03 2010.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程序设计 谭浩强 著 清华大学出版社 最新c语言程序设计教程刘正林等编著 华中科技 大学出版社2006.6 c语言与习题解答 李春葆 著 清华大学出版社 后续课程:面向对象程序设计、数据结构、操作系统、计算机组成原理, vc+ 6.0编程等,c语言丰富的数据类型 前一讲回顾,第讲 运算符和表达式,语言中运算符分类,“运算符”是描述各种不同运算操作的符号。 按照运算功能分类: 、算术运算符;、赋值运算符;、关系运算符; 、逻辑运算符;、位运算符;、自增自减运算符;、条件运算符;、逗号运算符。 按参与运算的运算量数目分类: 、单目运算符 、双目运算符 、三目运算符; i+; a+b ab ? a:b,表达式,表达式:由运算符和运算量组成的符合c语法规则的算式。 (运算量可以是变量、常量、有返回值的函数等) 例: a*11; a c语言中的表达式根据运算符的种类可以分为: 算术表达式、关系表达式、逻辑表达式、 赋值表达式、条件表达式、逗号表达式 混合表达式等。,、 算术运算符与算术表达式 、 关系运算符与关系表达式 、 逻辑运算符与逻辑表达式 、 自增和自减运算符和表达式 、 赋值运算符与赋值表达式 、 条件运算符与条件表达式 、 逗号运算符与逗号表达式 8、 位运算符与位运算表达式,语言中运算符及表达式,1、算术运算符与算术表达式,c语言中,算术运算符有5个,它们的具体含义见下表 :,算术运算符的使用规则 (1) +、-、*、/运算符的运算量可为整型或浮点型数据(包括常量、变量、有返回值的函数以及表达式)。 (2) 取模运算符%要求运算量必须是整型,且%后面的运算量不能为0。 (3) 除法运算x/y中,表达式y的取值不能为0。 (4) 当双目运算符的两个运算量的类型相同时,它们的运算结果的类型与运算量类型相同。例: 16 / 7 结果为整型2,小数部分被省去 16 / 5.0 结果为实型3.2 (5) 当双目运算符的两个运算量的类型不同时,运算前遵循类型的一般转换规则将运算量自动转换成值域较宽的相同类型。,数据类型自动转换遵循如下图所示规则:,(1)表达式中的字符型以及短整型一律被转换为整型,如果int类型能表示原来类型的值,则转换成int类型,否则转换成unsigned类型。 (2) 当一个运算量为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,赋值运算时的自动类型转换 将 赋值运算符“=”右子表达式结果的类型转成左侧变量的数据类型。 (赋值转换具有强制性,转换结果的类型完全由左侧变量的类型决定) 例: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)(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 = 15 , y = 6 x + y = 21 x y = 9 x * y = 90 x / y = 23 x1 / y1 = 2.500000 example2-4.c,例: 3 % 5 结果为3 -17 % 5 结果为-2 20 % 10 结果为0 常用%与/结合应用,来求某数的各位数字: int a=123; b=a%10 得到个位数 3 a/10%10 得到十位数 2 a/100%10 得到百位数1,2、关系运算符与关系表达式,关系运算符是用来比较两个运算量之间的大小关系的双目运算符,通常用来作为条件分支语句执行的判断条件。运算结果为0或者1. 关系表达式成立时,表达式的结果为整数1,否则为整数0 。 c语言中的6个关系运算符包括: = (大于或等于) (大于) != (不等于) 用关系运算符将前、后两个运算量连接起来的式子称为“关系表达式”,这两个运算量可以是任意表达式。,例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 | | (逻辑或) 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级最低。同一表达式中优先级高的运算符先执行运算。 运算符的结合性是指当一个运算对象两侧的运算符优先级相同时,两运算符进行运算处理的先后顺序。 结合方向分为:从左向右、从右向左。 例 : 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和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 自增自减运算符的运算 #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 = 9 example2-7.c,(1). 基本赋值运算 基本赋值运算符“=”是一个双目运算符,它的一般表达式形式为: 左值表达式 = 右值表达式 例: int i,j; char m,n; float x,y; double z j = i i和j的类型相同,无需转换,直接将i的值赋给j i = m m由char型向int型转换,将转换后的值赋给i z = x * i x * i的结果为double型,然后赋值给z i = m n m n的结果为整型,无需转换,直接将值赋给i i = j = 10 多重赋值表达式,赋值运算符按从右至左结合,即相 当于i=(j=10),先将10赋给j, 赋值表达式(j=10)的值 就是赋值后的j的值,再将其赋给i,5、 赋值运算符与赋值表达式,(2). 复合赋值运算符 在赋值运算符“=”前加上其他运算符构成。 复合赋值表达式的形式为: 左值表达式 op = 右值表达式 c语言中的复合赋值运算符共有10种: +=、-=、*=、/=、%=、&=、|=、=、=。 例如:i += j 等价于 i = i + j x *= y - 5 等价于 x = x * (y-5) m = 2 等价于 m = m 2,条件运算符( ? : )是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, , 表达式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 按位异或运算符“” 8.4 二进制左移运算符“” 8.6 按位取反运算符“”,8.1 按位与运算符“&”,按位与运算是对两个操作数按二进制bit位“求与”,当两数对应位都为1时,结果的对应位为1,否则为0。与运算符的定义如下表所示:,例如:a=0x96,b=0x80, a 1001 0110 则a&b的结果为0x80 b 1000 0000 结果 1000 0000,按位与的作用:(1)将某些位清零 如要将某端口控制的一组二极管中的某些发光二极管熄灭,实际上是将某个控制数的对应位清零,如a=0x55,要将a的低四位清零,那就要将a与一个低四位为零其它位为1的数进行按位与运算。 运算过程: 运算的结果是对象数据的低四位清0,其它不变。,(2)取数中的特定位 与上述操作相反,在实际操作中通常要求保持某些位的状态,如a=0x55,要保持a的低四位,其它位清零,那就要将a与一个低四位为1其它位为0的数进行按位与运算。 运算过程: 运算的结果是对象数据的低四位不变,其它清0,8.2 按位或运算符“|”,按位或运算是对两个操作数逐位“相或”。当它们都是0的时候,结果为0,否则为1。下表为位逻辑或操作的“真值表”,例如:a=0x36,b=0x55,则a | b的结果为0x77,按位或运算:,按位或的作用 (1)将数的某些位置1 如要将某端口控制的某些发光二极管点亮,实际上是将某个控制数的对应位置1,如a=0x55,要将a的低四位清零,那就要将a与一个数进行按位或运算,这个数的低四位为1其它位为0。 运算过程如下: 运算的结果是对象数据的低四位置1其它不变,(2)把一串二进制数连接到另一串二进制数后 实际应用中有时也需要将一串二进制数连接到另一串二进制数后,如通讯中的crc校验。 处理方式:先在对象字符串的末尾加上n个零然后与连接的字符串进行按位或操作。 如a=0x55,要连接的数据为8位二进制串,表示成十六进制为0xaa;则首先将a的后面加8个0;变成0x5500,然后与0xaa按位或。运算过程如下:,8.3 按位异或运算符“”,按位异或运算是将两个操作数逐位“相异或”,即对应位相异时结果为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占用32bits,因此还是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 按位取反运算符“”,按位取反运算符是将操作数进行逐位“取反”。 例如: 变量char a=0x6a,二进制表示为01101010, 按位取反后为10010101,所以a的结果为0x95。,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 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-10.c),变量x,y的值分别为1和2,它在内存中(标准16bit)的表示为: x: 0000 0000 0000 0001 y: 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. 浮点型变量的舍入误差问题 例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.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 投资笔测试题及答案
- 《左传曹刿论战》测试题带答案
- 互联网行业2025年6月一季报业绩稳健恒生科技指数处于震荡期
- 双层柔性光伏支架风振响应研究
- 《茶人三部曲》中的人物群像研究
- CoCrFeNi(Mn)AlxTiy高熵合金及其复合材料的组织与力学性能研究
- 1.1.2细胞的形态(教学课件)生物冀少版2024七年级上册
- 创新空间“产城创”融合机制与融合度评价研究-以浙中科创走廊为例
- 诊断性评价在初中英语写作教学应用的行动研究
- 基于GWRF模型的黑龙江省森林植被碳储量遥感估测
- 腕管综合征诊治循证临床实践指南(2024)解读
- 送桶装水合同协议
- 长期处方管理规范
- 人工智能背景下认知对抗的动态机制与策略研究
- 《人体器官系统》课件
- 知识产权管理体系全套程序文件+目录清单(29490-2023)
- 中建八局施工组织设计(287P)
- 变电站防恐课件
- 会考地理综合题答题模板+简答题归纳-2025年会考地理知识点梳理
- 国开《离散数学》形考任务1-3试题及答案
- 药品生产监督管理办法2024解读
评论
0/150
提交评论