第2章-数据类型与运算符.ppt

上传人:本田雅阁 文档编号:3423333 上传时间:2019-08-23 格式:PPT 页数:71 大小:475.04KB
返回 下载 相关 举报
第2章-数据类型与运算符.ppt_第1页
第1页 / 共71页
第2章-数据类型与运算符.ppt_第2页
第2页 / 共71页
第2章-数据类型与运算符.ppt_第3页
第3页 / 共71页
第2章-数据类型与运算符.ppt_第4页
第4页 / 共71页
第2章-数据类型与运算符.ppt_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《第2章-数据类型与运算符.ppt》由会员分享,可在线阅读,更多相关《第2章-数据类型与运算符.ppt(71页珍藏版)》请在三一文库上搜索。

1、第2章 数据类型和运算符,C 语言程序设计,2,本章主要内容,本章介绍C语言的基础,包括: 数据类型 运算符和表达式 均是程序设计的基本知识 为什么讨论这些知识?,通常程序要对数据进行操作处理: 处理的对象是数据 通过运算符和表达式进行操作,3,例如:,【例2.1】计算圆的面积,半径为 5 cm。 程序如下:,main( ) float r, area ; r=5 ; area=3.14*r*r; printf (“%fn “, area) ; ,运算结果是输出圆的面积:78.500000,程序中用到的数据:r、area、5、3.14 对数据进行的运算:* 、=,4,分析:,计算机操作处理时,

2、要完成以下工作: 在内存中给半径 r 和运算结果 area 开辟存储空间,存放它们的值。应该留多大的地方来存放它们的值? 数据 5 和 3.14 与 r 、area 不同,它们是在编写程序时就给出确定的值,在运算过程中不会改变。这样的数计算机怎么处理? 对整数 5 和小数3.14 ,计算机存放时是否有区别?,涉及数据类型 的基本知识,5,2.1 C程序的符号系统,C程序中可以出现的字符包括: 基本字符 标识符,6,2.1.1 基本字符集,大写英文字母:A B C X Y Z 小写英文字母:a b c x y z 数字:0 1 2 9 空白符:空格符、换行符、制表符 特殊字符:+ - * / (

3、 ) _ = ! # % . , ; : “ | & ? $ ,7,2.1.2 标识符,由字母、下划线和数字组成的字符序列,但必须用字母或下划线开头 用于程序中的变量、符号常量、数组、函数、数据类型等操作对象的名字,1系统定义标识符 具有固定名字和特定含义的标识符 分为关键字和预定义标识符 2用户定义标识符 用于对用户使用的变量、数组、函数等操作对象进行命名,8,关键字,数据类型: int、char、float、double、short、long、void、signed、unsigned、enum、struct、union、const、typedef、volatile 存储类别: auto、s

4、tatic、register、extern 语句命令字: break、case、continue、default、do、else、for、goto、if、return、switch、while 运算符: sizeof,9,预定义标识符,系统标准库函数 scanf、printf、putchar、getchar、strcpy、strcmp、sqrt等 编译预备处理命令 include、define等,10,对标识符的规定,用户定义标识符 必须以字母或下划线“_”开头 不能含有除字母、数字和下划线“_”外的其他字符 标识符中大小写字母含义不同 关键字必须用小写字母。不允许使用关键字为变量、数组、函数

5、等操作对象命名 预定义标识符允许用户对它们重新定义,当重新定义后将改变它们原来的含义,11,练习:正确区分标识符,正确区分哪些是合法标识符,哪些是不合法标识符。其中合法标识符中哪些是关键字,哪些是预定义标识符,哪些是用户定义标识符。 Abc define 2x double student m+y a# b-4 _1 While int let x%y name do wtm Ctrl swicth include,12,正确区分标识符,正确区分哪些是合法标识符,哪些是不合法标识符。 Abc define 2x double student m+y a# b-4 _1 While int le

6、t x%y name do wtm Ctrl swicth include,13,2.2 C语言的数据类型,C数据类型,整型 字符型 实型(浮点型) 空类型,本章讨论 基本类型数据,14,2.2.1 整型数据,1整型数据的类型 基本整型数据 int ,分配 4 Byte 短整型数据 short int,分配 2 Byte 长整型数据 long int,分配 4 Byte 整型数据均以二进制补码形式存储,问题: 为什么要采用补码? 如何表示?,15,计算机中正、负数的表示,例如:109 (1101101)2 要区别:109 和 109 方法是:将符号也数码化 即: 正的符号 用 0 表示 负的符

7、号 用 1 表示, 计算机中的数表示方法是: 符号位二进制数值(以 8bit 为例) 109 110 1101 0110 1101 109 110 1101 1110 1101,16,问题:计算机计算复杂化,例如计算: (-19)+(+22) 1001 0011 + 0001 0110,解决的方法是: 使用反码或补码的表示方法(按前述表示的编码称为原码),即能将减法一律转换为加法。,需要判断符号是否相同: 如果相同,结果符号不变,并进行绝对值相加 如果不同,结果取绝对值大的数的符号,并进行绝对值相减,17,原码、反码和补码,正数:原码、反码、补码相同 符号位为0,数值为对应的二进制数。 109

8、,01101101原 = 01101101反 = 01101101补 负数: 原码符号位为1,数值为绝对值的二进制数。 109 11101101原 反码符号位为1,数值为绝对值的二进制数各位变反。 109 10010010反 补码各位变反加1。109 10010011补,18,2. 有符号和无符号整型数据,有符号的整型数据 signed int 无符号的整型数据 unsigned int 区别是将最高位看作符号位还是数据位,例如: 1111 1111 1010 1000 作为有符号数使用时,最高为符号位 为负数,值是:- 88(再求一次补) 作为无符号数使用时,最高为数据位 为无符号的数,值是

9、:65448,19,例如:,main( ) int m; m= -3; printf(“m=%dn“,m); printf(“m=%un“,m); ,输出结果: m=-3 m=4294967293,按有符号数输出,按无符号数输出,20,整型数据的类型及规定,方括号表示可选项 (可不出现) short 分配2 Byte,int、long分配4 Byte,21,2.2.2 实型数据,1实型数据的类型 单精度实型数据 float,分配4 Byte 双精度实型数据double,分配 8 Byte 2实型数据的存储,单精度实型,指数部分,小数部分,小数的符号位,指数的符号位,22,实型数据的类型及规定,

10、例如:实型数据385.789的存储 385.789 = 0.385789103,0 0. 3857890,0 3,小数的符号位,指数的符号位,小数部分,指数部分,23,实型数据的类型及规定,C标准并未具体规定各种实型数据所占字节数,也不规定具体小数和指数部分的位数。 一般而言,小数部分位数多,数据表示的有效数字多,精度就高;而指数部分位数多,则表示的数据范围更大。,与指数部分位数有关,与小数部分位数有关,24,2.2.3 字符型数据,字符型数据char,分配 1 Byte 字符型数据是指字母、数字、各种符号等用ASCII值表示的字符 例如 a 是一个char类型数据,称作字符常量,存储:,0

11、1 1 0 0 0 0 1,2.1.4 空类型,空类型void 通常与指针或函数结合使用,25,2.3 常量,在运行程序的过程中值保持不变的量 1整型常量 十进制:09 八进制:07,以 0开头 十六进制:09,AF/af,以 0X或 0x开头,例如: 100 -8 0 +123 010 024 0100 073 0x38 0x10 0X10 0XFF 0x0a,26,2.2.1 常量,在运行程序的过程中值保持不变的量 1整型常量 十进制:09 八进制:07,以 0开头 十六进制:09,AF/af,以 0x或 0X 开头,八进制的数码范围为07;如: 018 十六进制的数码除了数字09外, 还

12、使 用英文字母a f (或A F)表示1015。 如:0x1e ,注意:,27,2. 实型常量,十进制形式:由数字和小数点组成; 例如: 3.4 , 4. , .3 指数形式: “十进制小数”+“ e(或E)”+“十进制数整数”。 例如: 12.5e-6 表示12.510-6 -36.5E5 表示-36.5105, 小数点不能单独出现; 0. .0 . e或E的两边必须有数,且其后面必须为整数; 如: 6E0.2 e5 ,注意,28,3. 字符型常量,字符常量 : 单引号括起来的单个字符 例如:a、A 、+ 、3、 等 转义字符常量: 单引号括起来的 与字符组合,例如:,例如: 字符常量A可表

13、示为:A、 101 、 x41,29,4. 字符串常量,用双引号括起的一个字符序列 例如:“ABC“、“123“、“a“、 “nt “ “nGood morning“ 字符串常量的长度 : 所包含的字符个数 字符串常量的存储方式:,所占存储单元数:串长度1 例如:,字符串 结束标记,30,5. 符号常量,以标识符来代表的常量 事先编译预处理命令define定义 编译时先由系统替换为它所代表的常量,再进行编译 例如:,#define LEN 2.5 main( ) float a,b; a= 2*3.14 *LEN; b=3.14*LEN*LEN; printf(“a=%f,b=%fn“,a,b

14、); ,编译前系统进行替换,31,5. 符号常量,编译预处理后 main( ) float a,b; a= 2*3.14 *2.5; b=3.14*2.5*2.5; printf(“a=%f, b=%fn“,a,b); ,LEN被替换为,define是编译预处理命令,必须以“#”开头 编译预处理命令在后面章节讨论。,注意,32,2.4 变量,1. 变量的有关概念 在程序运行过程中,其值改变的数据,称为变量,变量用标识符表示,称为变量名。 变量必须“先定义后使用” 系统为变量分配存储单元,存储变量的值。 编写程序时通过变量名来存、取变量值。,例如: 有变量a 它的值是510,33,2. 变量定义

15、,变量定义的一般格式: 数据类型说明符 变量列表; 例如:int i, j; long k, m; float x,y; char ch1,ch2;,必须使用合法的标识符作变量名 不能使用关键字为变量命名,34,3. 变量的初始化:,允许在说明变量的时候对变量赋初值。 例如:int a=5, b=10+2; double x=23.568, y ; char ch1=a, ch2=66, ch3=142; 表示定义变量并对变量存储单元赋值。 错误的初始化: int a=3+b, b=5; float m=n=23.16;,35,2.5 运算符和表达式,主要内容: 算术运算符和算术表达式 赋值运

16、算符和赋值表达式 关系运算符和关系表达式 逻辑运算符和逻辑表达式 位运算符和位运算表达式 条件运算符和条件表达式 逗号运算符和逗号表达式 其他运算符及其运算,36,运算符的有关概念,作用: 对运算对象完成规定的操作运算 类型: 按运算对象分: 单目(a+)、双目(a+b)、三目(a?a:b) 按功能分: 算术、赋值、关系、逻辑 条件、逗号、位、其他,37,运算符的优先级和结合性,优先级 指各种运算符号的运算优先顺序 例如:算术运算优先于关系运算 算术运算中先 * / 后 + -,结合性 指运算符号和运算对象的结合方向 分为:从左向右(左结合)和从右向左(右结合) 例如:算术运算符为左结合 a-

17、b+4 赋值运算符为右结合 a= b = 5 ( C语言规定见教材 P350附录II),38,本章涉及的运算符,+ - * / % + - + - = += -= *= /= %= &= |= = = = ?: , & sizeof (数据类型标识符),39,表达式的有关概念,什么是表达式 由运算符将运算对象连接成的式子,它描述了一个具体的求值运算过程。 计算表达式的值 按照运算符的运算规则求值 求值时注意运算符的优先级和结合性 表达式值的类型 自动转换 强制转换,40,例如:,表达式:int a=1,b=2,c=3; 150+b*2-12.456 b=(+a) - 2 a /= a *= (

18、a = 2) f=abc -a |+b&c+ max=ab ? a : b a=3,a+=3,a*a 1/(float)a+6,41,算术运算,算术运算符的优先级,没有乘方运算符,要计算a3要写作 a*a*a 的连乘,或用标准库函数 pow(a, 3) “/”的运算对象可为各种类型数据,但是当进行两个整型数据相除时,运算结果也是整型数据 “%”要求运算对象必须是整型数据,功能是求两数相除的余数,余数的符号与被除数的符号相同。,例如:5.0/2的值为2.5; 但是:5/3值为1,-5/3值为-1; (多数机器采用“向零取整”的方法),例如:7%4值为3,-7%4值为-3,42,自增自减运算,+

19、-是单目运算符 有前缀和后缀两种形式 前缀形式: 先自增(自减)再引用; 后缀形式: 先引用再自增(自减); 功能: 前缀形式 +a 等价于 a = a + 1 -a 等价于 a = a 1 后缀形式 a+ 等价于 a = a + 1 a- 等价于 a = a 1,表达式的值会不同,43,例如:,当 a5 时 +a 表达式的值为 6,且 a6 a+ 表达式的值为5 ,且 a6 b=+a 等价于 a=a+1; b=a 表达式的值为6,且 a=6, b=6 b=a+ 等价于 b=a; a=a+1 表达式的值为5,且 a=6, b=5,44,说明:,+ 和 - 的运算对象只能是变量(或运算结果是变量

20、的表达式), 不能是常量(或运算结果是数值的表达式)。 例如: 5+、(a+2)+ 不合法。 具有右结合性,结合方向为从右到左。 例如: a+ 等价于 -(a+) 如果有多个运算符连续出现时,C系统尽可能多的从左到右将字符组合成一个运算符 例如: i + j 等价于 ( i+)+j -i+-j 等价于 -(i+)+(-j),45,赋值运算,赋值运算符(右结合) = += -= *= /= %= &= |= = = = 赋值表达式 将表达式的值存入变量对应的内存单元中 m=12 b=(+a)-2 m%=3+n 等价于 m=m%(3+n) x *= (x = 5),46,说明:,赋值号左边必须是变

21、量,右边可以是C语言任意合法的表达式 例如:n= t +210 等价于:a= (b=( (b*c)10) ) 赋值号与数学中的等号含义不同 例如:数学中 a=b 等价于 b=a C语言中 a=b 不等价于 b=a,47,关系运算,关系运算符 (左结合) = =c 等价于 a = ( b=c ) 与 (a=b)=c 不等价 关系运算符优先于赋值,低于算术,48,说明:,关系运算的结果应该是逻辑值。C语言用数值用 1 表示逻辑真, 0 表示逻辑假 例如: 75 的值是 1,57 的值是 0 ab的值是 0, ab 的值是1 即关系表达式的值:0 或1 实型数可进行大于或小于比较,但通常不进行 =

22、或 != 的关系运算,49,逻辑运算符,逻辑运算符 & | ! 逻辑运算符的运算规则,50,逻辑表达式,逻辑表达式 用逻辑运算符将运算对象连接成的式子 例如:0&b a &b | c&d a | b-5 | c/4 !x+y = z 逻辑运算符的优先级 和结合性: !是单目运算符,右结合,高于算术 & 和 | 是双目运算符,左结合,高于赋值运算符,低于关系运算符,51,逻辑运算规则,从左到右依次进行逻辑计算 运算对象为非0表示逻辑真 运算对象为 0 表示逻辑假 逻辑运算的结果为 0 或 1 例如设:a=15,b=0,c=-2 a & b & c 结果为0 a | b | c 结果为1 (a+c

23、) | b & c 结果为1,52,逻辑运算规则(续),运算按照从左至右的顺序进行,一旦能够确定逻辑表达式的值,就立即结束运算 逻辑运算的短路性质 例如设:a=1,b=0,c=-2 a & b & c,(a+) | + b& -c,为 0,运算终止,表达式值为 0,为非0,运算终止,表达式值为 1 且a为2,b为0,c为-2 (b,c保持原值),53,关系与逻辑运算符的应用,表示数学公式abc 判断a, b, c三条线段能否组成一个三角形 a, b不同时为负,a+bc & a+cb & b+ca,a=0 | b=0 !(a=0)|(a=0&b=0&b=0),ab & bc,54,条件表达式运算

24、,条件运算符: ? : 条件表达式的一般形式 表达式1 ? 表达式2 : 表达式3 例如:m=10 & b20 ? a : b x=3+a5 ? 100 : 200,C语言中唯一的三目运算符,要正确区分用 ?和 :分隔的表达式 涉及条件运算符的优先级与结合性,55,条件运算符优先级,条件运算符优先级高于赋值、逗号运算符,低于其他运算符 例如: m=10 & b20 ? a : b x=3+a5 ? 100 : 200,等价于:(mn) ?(x) :(a+3),等价于:(a+=10 & b20) ? a : b,等价于:x= ( 3+a5 ) ? 100 : 200 ),56,条件运算符的结合性

25、,条件运算符具有右结合性 当一个表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒号配对,并按这一原则正确区分各条件运算符的运算对象。,例如:wx ? x+w : xy ? x : y 与 wx ? x+w : ( xy ? x : y) 等价 与 (wx ? x+w : xy) ? x : y 不等价,57,逗号表达式运算,逗号表达式的一般形式 表达式1,表达式2,表达式n 逗号表达式的值 从左向右,依次对表达式求值,最后得到表达式n 的值就是逗号表达式的值,例如: a=5, a+, a* 3 表达式值为 18,且a=6 t=1, t+5, t+ 表达式值为 1,且t=2 x

26、=(a=3*5, a*4 ) 表达式的值为60,且x=60, a=15,58,取地址运算符 &,为单目运算符 运算对象只能是变量 运算结果是变量的存储地址 例如有定义: int a , student; char ch; 可以对变量a、ch、student 进行&运算: &a &ch &student,59,长度运算符 sizeof,为单目运算符 运算对象只能是变量名或数据类型标识符 运算结果为该变量或该数据类型的长度,main( ) int a=5; double x; printf(“%d %d “,sizeof(int),sizeof(a); printf(“%d %d “,sizeof

27、(double),sizeof(x); printf(“%d %dn“,sizeof(float),sizeof(char); ,输出结果: 4 4 8 8 4 1,60,2.4 运算中数据类型的转换,2.4.1 数据类型的自动转换(隐式转换) 转换原则:,自动将精度低、表示范围小的运算对象类型向精度高、表示范围大的运算对象类型转换,61,数据类型的自动转换(续),例如: int x=2;float y=1.6;char c=A; 求表达式 c + x * y 的值。,c + x * y,65(int),2(int),1.6(float),= 68.2 (double),62,2. 赋值运算中

28、的类型转换, = 小数部分自动补0, = 自动舍去实型表达式的小数部分(注意不进行四舍五入) = = 自动截取表达式值的低字节赋值,舍去高字节 = (见下页例) = 自动给高字节补0 或补1,63,例如:,C=a,01100001,01100001,值为(65377)10 值为(159)10,64,2.4.2 数据类型的强制转换(显式转换),强制转换的一般形式 (类型名) 表达式 作用:强制把该表达式的类型转为指定的类型。 例如: (long)2 2L、 (int)4.2 4 1/(float)a+6 (double),注意: (float) 22/5 与 (float) (22/5) 不同

29、错误的类型转换 b= int (3*a),65,综合举例 1,int a=1,b=2,c,d; c=(-a+)+(+b); d=(b-)+(+a)-a;,运行结果: a=3; b=2; c=2; d=3,66,综合举例 2,int a=1,b=2,c,d,e; c=(-a+)+(+b); d=(b-)+(+a)-a; e=(a/(+b)-(b/(-a);,运行结果: a=2; b=3; c=2; d=3; e=0,67,综合举例3,int a=2,b=3,c,d,e,f; c=(a+ = -b); d=(a= = +b); e=(a- != b); f=(+ a b-);,c=1 a=3 b=

30、2 d=1 a=3 b=3 e=0 a=2 b=3 f=0 a=3 b=2,运行结果 a=3; b=2; c=1; d=1; e=0; f=0,68,综合举例4,int x=4, y=25, z=2; z=(-y/+x)*z-;,运行结果: z=7,69,综合举例5,int x=y=z=0; +x|+y,运行后x,y,z的值分别为: 1 0 0 1 1 0 1 1 1,70,综合举例6,int a=2; char c=a; float f=3.0; a+a*6/f+c%a (a2)?3:2 (a=2)*f (1,2,3)-a,=2+4.0+1=7.0f =1+5=6 =3.0f =2 =6.0f =1,71,本章结束,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1