C语言程序设计基础第四讲.pptx_第1页
C语言程序设计基础第四讲.pptx_第2页
C语言程序设计基础第四讲.pptx_第3页
C语言程序设计基础第四讲.pptx_第4页
C语言程序设计基础第四讲.pptx_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计基础 第四讲 运算及表达式求值 中南大学信息科学与工称学院 计算机科学系 张伟 基本内容 C基本运算符简介 C特殊运算介绍 多目运算及其优先级分类 运算的结合性质 复杂表达式求值 表达式求值过程中的数据类型装换 C基本运算符简介 序号种类类内容功用 1算术运算符+ - * / % + - 数值计算 2关系运算符 = = = != 比较运算 3逻辑运算符 printf(“%d”,i+); printf(“%d”,i); printf(“%d”, +i); printf(“%d”,i); C特殊运算介绍自加/自减运算 main()main() intint a=1,b=1; a=1,b=1; printfprintf(“+a=%(“+a=%d,bd,b+=%dn”,+=%dn”,+a,ba,b+);+); printfprintf(“ a=%(“ a=%d,bd,b=%dn ”,=%dn ”,a,ba,b); ); printfprintf(“ -a=%(“ -a=%d,bd,b-=%dn ”,-=%dn ”,-a,ba,b-);-); printfprintf(“ a=%(“ a=%d,bd,b=%dn ”,=%dn ”,a,ba,b); ); C特殊运算介绍位运算 scanf(“%dn%dn”, max = xy?x,y; printf(“%dn”,max); C特殊运算介绍逗号运算 逗号表达式的构成形式如下:表达式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) 多目运算及其优先级分类一 任何一个表达式都是由运算符及相关的运算数(操 作数)组成。一个运算符在实现计算过程中所需要 的操作数个数,成为该运算符的目数。如基本的算 术运算符都属于二目运算,条件运算符属于三目运 算。而逗号运算属于多目运算。 在C中,最为常见的是一到三目运算,一种运算符 其目数越少,则其运算优先级越高。即单目运算的 优先级高于二目运算,二目运算高于三目运算,以 此类推。 语言中,运算符的运算优先级共分为 15 级。1 级最高,15 级最低。在表达式求值的时候,优先级 高的运算进行结合所需的操作数不能被优先级低的 计算所拆分。 运算的结合性质 在C语言表达式求值过程中,优先级高的运算优 先执行.而在优先级相同的情况下,运算符的结 合性质决定了同级运算执行的先后顺序. C运 算符的结合性分为左结合和右结合两种. 所谓的左结合即先左后右或从左向右的方向进 行计算.如x-y+z在求值过程中,先计算x-y,再计 算+z.即+、-运算具有左结合性; 所谓的右结合即先右后左或者从右相左的方向 进行计算.如x=y=z的执行顺序为x=(y=z),即=运 算具有右结合性。 多目运算及其优先级分类/结合性质表1 优优先级级运算符含义义方式结结合性目 1数组下标数组名表达式左 ()改优先级/函数调用(表达式)/函数(参数) .对象成员选择对象名.成员 -指针成员选择指针名-成员 2-负号运算-表达式右单 (类型)强制类型转化(数据类型)表达式 + 自加+变量/变量+ - 自减-变量/变量- *取值*指针变量 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+ii-i 值 复杂表达式求值方法警告 C的表达式功能强大且垃圾,没有把 握不要构造过于复杂的表达式; 任何复杂的表达式都可经过拆分后变 成若干简单表达式的等效组合 不同的C编译系统,对求值规则的解释 可能会有所差别,因此同样的表达式 在不同的系统下可能会得到不同的值 表达式求值过程中的类型转换自动 当运算符两边的操作数类型不同时,其中一个操作数就要经过当运算符两边的操作数类型不同时,其中一个操作数就要经过 类型转换以和另一个操作数的类型相一致,然后才能进行运类型转换以和另一个操作数的类型相一致,然后才能进行运 算。算。 变换操作数采取变换操作数采取就高不就低就高不就低的原则。即级别低的操作数先被转的原则。即级别低的操作数先被转 换成和级别高的操作数具有同一类型,然后再进行运算,结果换成和级别高的操作数具有同一类型,然后再进行运算,结果 的数据类型和级别高的操作数相同。各种类型级别的高低如下的数据类型和级别高的操作数相同。各种类型级别的高低如下 所示:所示: 高高 double floatdouble float longlong unsigendunsigend 低低 intint char, short char, short 例如:例如:10+x+7*2.0-7/510+x+7*2.0-7/5 强制类型转换表达式:强制类型转换表达式:( (类型类型)表达式表达式) ) 例如:例如:( (intint)(1.7+5.6)=?,()(1.7+5.6)=?,(intint)3.2+5.8=?)3.2+5.8=? 表达式求值过程中的类型转换 类型转换也发生在赋值运算符的两边,且不管类型转换也发生在赋值运算符的两边,且不管 赋值运算符右边表达式的结果类型为何,一律赋值运算符右边表达式的结果类型为何,一律 转换为左边变量的类型,然后再赋给左边的变转换为左边变量的类型,然后再赋给左边的变 量。量。 类型的提升类型的提升: :是将较低级的类型转换为较高级是将较低级的类型转换为较高级 的类型的类型, ,通过增加一些二进制位来完成通过增加一些二进制位来完成, ,精度没精度没 有损失。有损失。 类型的下降类型的下降: :是将较高级的类型转换为较低级是将较高级的类型转换为较低级 的类型的类型, ,要截断和舍入二进制位,通常会引起要截断和舍入二进制位,通常会引起 精度的损失精度的损失 表达式求值过程中的类型转换赋值/强制 (1) 浮点型与整型 将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数 部分, 只保留整数部分。 将整型值赋给浮点型变量,数值不变,只将形式改为浮点形 式, 即小数点后带若干个0。注意:赋值时的类型转换实际 上是强制的。 (2) 单、双精度浮点型 由于C语言中的浮点值总是用双精度表示的,所以float 型 数据只是在尾部加0延长为doub1e型数据参加运算,然后直接 赋值。doub1e型数据转换为float型时,通过截尾数来实现, 截断前要进行四舍五入操作。 (3) char型与int型 int型数值赋给char型变量时,只保留其最低8位,高位部 分舍弃。 char型数值赋给int型变量时, 一些编译程序不管其值大 小都作正数处理,而另一些编译程序在转换时,若char型数据 值大于127,就作为负数处理。对于使用者来讲,如果原来 char型数据取正值,转换后仍为正值;如果原来char型值可正可 负,则转换后也仍然保持原值, 只是数据的内部表示形式有 所不同。 表达式求值过程中的类型转换赋值/强制 (4) int型与1ong型 long型数据赋给int型变量时,将低16位值送给int 型变量,而将高16 位截断舍弃。(这里假定int型占 两个字节)。 将int型数据送给long型变量时,其外 部值保持不变,而内部形式有所改变。 (5) 无符号整数 将一个unsigned型数据赋给一个占据同样长度存 储单元的整型变量时(如:unsignedint、unsigned longlong,unsigned shortshort) ,原值照赋,内 部的存储方式不变,但外部值却可能改变。 将一个非unsigned整型数据赋给长度相同的 unsigned型变量时, 内部存储形式不变,但外部表 示时总是无符号的。 表达式求值过程中的类型转换赋值/强制 计算机中数据用补码表示,int型量最高位是符号 位,为1时表示负值,为0时表示正值。如果一个无 符号数的值小于32768则最高位为0,赋给 int型变 量后、得到正值。如果无符号数大于等于32768, 则最高位为1, 赋给整型变量后就得到一个负整数 值。反之,当一个负整数赋给unsigned 型变量时, 得到的无符号值是一个大于32768的值。 C语言这种赋值时的类型转换形式可能会使人感到 不精密和不严格,因为不管表达式的值怎样,系统 都自动将其转为赋值运算符左部变量的类型。 而转变后数据可能有所不同,在不加注意时就可 能带来错误。 这确实是个缺点,也遭到许多人们 批评。 类型转换后的结果和编译系统、机器字长有很大关 系 类型转换例子 #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= a;printf

温馨提示

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

评论

0/150

提交评论