第3~4讲 第2章 运算符和表达式.ppt_第1页
第3~4讲 第2章 运算符和表达式.ppt_第2页
第3~4讲 第2章 运算符和表达式.ppt_第3页
第3~4讲 第2章 运算符和表达式.ppt_第4页
第3~4讲 第2章 运算符和表达式.ppt_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、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

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

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

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

5、整型一律被转换为整型,如果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 =

6、 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);时,是按四舍五入进行输出,强制类型转换 强制类型转换是靠强制类型转换运算符

7、来实现数据类型转换的,其目的是将表达式转换成“类型名”所指定的类型。也称为显式转换 。 表达式形式: (类型名) 表达式 例: 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

8、 = %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 = 2.3 x1 / y1 = 2.500000 example2-4.c,例:3 % 5 结果为3 -17 % 5 结果为-2 20 % 10 结

9、果为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

10、 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个逻辑运算符包括: ,4、 自增和自减运算符,“+”-”运算符的使用: (1)前置运算是变量先自增1或自减1后,再参与表达

11、式中其他的运算,即先增(减)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 mai

12、n( ) 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的

13、值赋给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种: +=、-=、*=、/=、%=、

14、 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。 整个

15、逗号表达式的值为2。 表达式 a=(b = a+ , a % 3); 计算结果为 a=2;,7、 逗号运算符与逗号表达式,8、位运算(int或char型数据),通常的运算符是对一个数据整体值进行操作,位运算提供了对数据对象在内存中的位(bit)进行操作。位运算符操作对象为整型或字符型数据。 8.1 按位与运算符“则首先将a的后面加8个0;变成0 x5500,然后与0 xaa按位或。运算过程如下:,8.3 按位异或运算符“”,按位异或运算是将两个操作数逐位“相异或”,即对应位相异时结果为1,否则为0。下表为 位逻辑异或操作的“真值表”,异或运算:,规律:某位要保持不变 就异或0,某位要取反就异或

16、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 二进制右移运算符“”,二进制右移运算把数据

17、向右移动若干位,移出右边界的位将丢失,左侧的新位的补充遵循下面的规则: (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 按位取反运算符“”,按位取反运算符是将操作数进行逐位“取反”。

18、例如: 变量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 0000 它

19、的实际十进制值为 -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,截去小数后,结果

20、应为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

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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论