




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言程序设计基础第四讲 运算及表达式求值,中南大学信息科学与工称学院 计算机科学系 张伟,基本内容,C基本运算符简介 C特殊运算介绍 多目运算及其优先级分类 运算的结合性质 复杂表达式求值 表达式求值过程中的数据类型装换,C基本运算符简介,基础赋值运算 =,一个二元运算符,其左操作数只能为变量,而右操作数可以为常量、变量或表达式,即:变量= 表达式 在赋值过程中,首先对等号右边的表达式求值,再将求值结果赋予=左边的变量 赋值表达式可以出现在其他表达式中:(a=1)+(b=2)*8-(c=4) 赋值表达式右侧也可以是一个赋值表达式:a=(b=0) 算术运算符的优先级高于赋值运算符,结合顺序是“
2、从右至左” 。例如:a=b=c=d=1,a=8+(b=2), a=(b=5)+(c=7),a=b=1+(c=3),C特殊运算介绍-%求余,模运算符是一个二元运算符。 优先级和结合方向同*和/。 要求两侧的操作数均为整型数据。且nm的结果为n/m的余数部分,即n被m除的余数。 余数的符号与被除数一致。如:94的结果为1,63的结果为0,45的结果为4,-4%5=? 4%-5=? -4%-5=?,C特殊运算介绍自加/自减运算,+和-使参加运算对象的值增1或减1 单目运算符,运算对象可以是整型或实型变量,不能是常量或表达式,如:+a,-a 其构成形式有如下四种:前缀(+a、-a),后缀(a+、 a-
3、),运算后a的值相同,表达式的值不同。,#include Main() int I = 0; printf(“%d”,i+); printf(“%d”,i); printf(“%d”, +i); printf(“%d”,i); ,C特殊运算介绍自加/自减运算,main() int a=1,b=1; printf(“+a=%d,b+=%dn”,+a,b+); printf(“ a=%d,b=%dn ”,a,b); printf(“ -a=%d,b-=%dn ”,-a,b-); printf(“ a=%d,b=%dn ”,a,b); ,C特殊运算介绍位运算, scanf(“%dn%dn”, ,C特
4、殊运算介绍逗号运算,逗号表达式的构成形式如下:表达式1,表达式2,表达式n。将多个表达式连接起来构成逗号表达式。 逗号表达式的求解过程是:先求解表达式1,再求解表达式2,最后求解表达式n,且表达式n的值就是该逗号表达式的值。 逗号表达式的结合顺序:自左向右。 逗号运算符的优先级在所有运算符中是最低的。 例: a=(3+5,3*5,5/3) a=3+5,3*5,5/3 (i=3,i+,+i,i+5),多目运算及其优先级分类一,任何一个表达式都是由运算符及相关的运算数(操作数)组成。一个运算符在实现计算过程中所需要的操作数个数,成为该运算符的目数。如基本的算术运算符都属于二目运算,条件运算符属于三
5、目运算。而逗号运算属于多目运算。 在C中,最为常见的是一到三目运算,一种运算符其目数越少,则其运算优先级越高。即单目运算的优先级高于二目运算,二目运算高于三目运算,以此类推。 语言中,运算符的运算优先级共分为 15 级。1 级最高,15 级最低。在表达式求值的时候,优先级高的运算进行结合所需的操作数不能被优先级低的计算所拆分。,运算的结合性质,在C语言表达式求值过程中,优先级高的运算优先执行.而在优先级相同的情况下,运算符的结合性质决定了同级运算执行的先后顺序. C运算符的结合性分为左结合和右结合两种. 所谓的左结合即先左后右或从左向右的方向进行计算.如x-y+z在求值过程中,先计算x-y,再
6、计算+z.即+、-运算具有左结合性; 所谓的右结合即先右后左或者从右相左的方向进行计算.如x=y=z的执行顺序为x=(y=z),即=运算具有右结合性。,多目运算及其优先级分类/结合性质表1,多目运算及其优先级分类/结合性质表2,多目运算及其优先级分类/结合性质表3,复杂表达式求值方法,按照优先级从高到低的顺序执行计算过程 同优先级的计算按照运算符结合属性决定计算方向,进而决定运算执行的先后顺序(为了避免混乱,C规定同优先级的运算符结合方向是一致的) 在表达式求值过程中,按照优先级原则进行分层计算,在同优先级中,结合方向决定了计算的先后顺序. +、-属于有“副作用”的运算,计算过程中要特别注意
7、如果一定要构造复杂的表达式,要善于使用括号明晰运算优先级及求解的层次关系,复杂表达式求值方法例1,#include main() int i=5,j=5,p,q; p = i+i+i+; printf(“%d %dn”,p,i); /q = +j+j+j; /printf (“%d %dn”,q,j); ,值,+,+,i+,i+,i+,复杂表达式求值方法例2,#include Main() int I = 3; printf(“%dn”,i+*+i+i-*-i); printf(“%d”,i); ,+,*,*,i+,+i,i-,-i,值,复杂表达式求值方法警告, C的表达式功能强大且垃圾,没有
8、把握不要构造过于复杂的表达式; 任何复杂的表达式都可经过拆分后变成若干简单表达式的等效组合 不同的C编译系统,对求值规则的解释可能会有所差别,因此同样的表达式在不同的系统下可能会得到不同的值,表达式求值过程中的类型转换自动,当运算符两边的操作数类型不同时,其中一个操作数就要经过类型转换以和另一个操作数的类型相一致,然后才能进行运算。 变换操作数采取就高不就低的原则。即级别低的操作数先被转换成和级别高的操作数具有同一类型,然后再进行运算,结果的数据类型和级别高的操作数相同。各种类型级别的高低如下所示: 高 double float long unsigend 低 int char, short
9、例如:10+x+7*2.0-7/5 强制类型转换表达式:(类型)表达式) 例如:(int)(1.7+5.6)=?,(int)3.2+5.8=?,表达式求值过程中的类型转换,类型转换也发生在赋值运算符的两边,且不管赋值运算符右边表达式的结果类型为何,一律转换为左边变量的类型,然后再赋给左边的变量。 类型的提升:是将较低级的类型转换为较高级的类型,通过增加一些二进制位来完成,精度没有损失。 类型的下降:是将较高级的类型转换为较低级的类型,要截断和舍入二进制位,通常会引起精度的损失,表达式求值过程中的类型转换赋值/强制,(1) 浮点型与整型 将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分,
10、 只保留整数部分。将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式, 即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。(2) 单、双精度浮点型 由于C语言中的浮点值总是用双精度表示的,所以float 型数据只是在尾部加0延长为doub1e型数据参加运算,然后直接赋值。doub1e型数据转换为float型时,通过截尾数来实现,截断前要进行四舍五入操作。 (3) char型与int型 int型数值赋给char型变量时,只保留其最低8位,高位部分舍弃。 char型数值赋给int型变量时, 一些编译程序不管其值大小都作正数处理,而另一些编译程序在转换时,若char型数据值大于127,
11、就作为负数处理。对于使用者来讲,如果原来char型数据取正值,转换后仍为正值;如果原来char型值可正可负,则转换后也仍然保持原值, 只是数据的内部表示形式有所不同。,表达式求值过程中的类型转换赋值/强制,(4) int型与1ong型 long型数据赋给int型变量时,将低16位值送给int型变量,而将高16 位截断舍弃。(这里假定int型占两个字节)。 将int型数据送给long型变量时,其外部值保持不变,而内部形式有所改变。 (5) 无符号整数 将一个unsigned型数据赋给一个占据同样长度存储单元的整型变量时(如:unsignedint、unsigned longlong,unsign
12、ed shortshort) ,原值照赋,内部的存储方式不变,但外部值却可能改变。 将一个非unsigned整型数据赋给长度相同的unsigned型变量时, 内部存储形式不变,但外部表示时总是无符号的。,表达式求值过程中的类型转换赋值/强制, 计算机中数据用补码表示,int型量最高位是符号位,为1时表示负值,为0时表示正值。如果一个无符号数的值小于32768则最高位为0,赋给 int型变量后、得到正值。如果无符号数大于等于32768,则最高位为1, 赋给整型变量后就得到一个负整数值。反之,当一个负整数赋给unsigned 型变量时,得到的无符号值是一个大于32768的值。 C语言这种赋值时的类
13、型转换形式可能会使人感到不精密和不严格,因为不管表达式的值怎样,系统都自动将其转为赋值运算符左部变量的类型。 而转变后数据可能有所不同,在不加注意时就可能带来错误。 这确实是个缺点,也遭到许多人们批评。 类型转换后的结果和编译系统、机器字长有很大关系,类型转换例子,#include stdafx.h #include stdio.h int _tmain(int argc, _TCHAR* argv) float x = 8.7; int a=5;char c; long z = 22222222; /float to int a = (int)x; printf(%dn,a); /int to float x=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 预防职业病教学课件
- 新生儿肺炎表现及预防
- 《电子产品制造技术》课件-第2章 印制电路板认知
- 冲床维修培训
- 顺利消防2023课件
- 项目现场安全课件
- 《道路勘测设计》课件-第三章 平面设计
- 音乐律动介绍课件
- 汽车配套产业基地项目风险管理方案(范文)
- 城市污水管网建设工程投资估算方案(模板)
- 食用油储存期品质变化的太赫兹光谱无损识别
- 华北理工大学生物药剂学与药物动力学教案
- 太平人寿保险有限公司个人寿险业务人员管理办法XXXX版
- 胎盘早剥预案演练脚本
- 五山文学全集第一卷
- 聚磷腈功能高分子材料的合成及应用
- 中国铁路总公司《铁路技术管理规程》(高速铁路部分)2014年7月
- 钙加维生素Dppt课件(PPT 14页)
- TRD深基坑止水帷幕施工方案(22页)
- 八少八素初试甄别试题
- 企业组织架构图模板
评论
0/150
提交评论