第三章数据类型运算符与表达式_第1页
第三章数据类型运算符与表达式_第2页
第三章数据类型运算符与表达式_第3页
第三章数据类型运算符与表达式_第4页
第三章数据类型运算符与表达式_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、第三章第三章 数据类型、运算符与表达式数据类型、运算符与表达式3.1 C的数据类型空类型指针类型共用体类型结构体类型数组类型构造类型枚举类型双精度型单精度型实型(浮点型)字符型整型基本类型数据类型 3.2 常量与变量常量与变量3.2.1常量和符号常量常量:在程序运行过程中,其值不能被改变的量。例:12、0、-3为整型常量;4.6、-1.23实型常量,d、a为字符常量。符号常量:用一个标识符代表的常量。 1)符号常量定义格式 #define 常量符号名常量符号名 常量常量 2)符号常量不同于变量,它的值在其作用 域内不能改变,也不能再被赋值; 3)习惯上,符号常量名用大写,变量名用小写。例 3.

2、1: #define PRICE 30 main( ) int num,total; num10; total=num*PRICE;printf(“total=%d”,total); 符号常量定义语句,PRICE符号定义后等同于30此句等同于Total=num*30使用符号常量的好处:(1)含义清楚,见名知义见名知义,使用程序更加清楚易读;(2)在需要改变一个常量时能做到“一改全改一改全改”,便于程序的修改; 例如:如果在程序中多处使用到某物品的价格,如果价格用常数表示常数表示,则在价格调整时,就需要在程序中作多处修改多处修改,若用符号常量符号常量PRICE代表价格,只需改动一处一处即可。3.

3、2.2变量变量定义:在程序运行时其值可以改变的量称为在程序运行时其值可以改变的量称为变量变量。变量。变量具有一个具有一个变量名变量名,并在内存中占据一定的存储单,并在内存中占据一定的存储单元。元。变量名变量名即为该变量占用的即为该变量占用的存储单元的地址存储单元的地址。变量名和变量值之间的联系和区别3a存储单元变量值变量名变量值存取过程变量值存取过程变量名根据变量名找到对应的存储单元取出存储单元中存储的变量值关于标识符关于标识符(identifier)组成字符的规定:组成字符的规定:(1)C语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须字母或下划线。 例:合法的标识符:

4、sum,average,_total,lotus_1_2_3,BASIC 不合法的标识符 M.D.John,¥123,#33,3D64,ab (2) C语言中,区分大小写字母,大写字母和小写字母被认为是两个不同的字符。 例:sum和SUM认为为不同的标识符。 一般情况下,变量名采用小写字母表示。(3)关于标识符长度的规定:Turbo C允许32个字符,有的系统如IBM PC和MS C取8个字符,如果变量名长度超过8个,只有前8个有效,后面的不被识别。例如: student_name和student_number被认为同一变量 注意:这种类型的错误,系统在编译时不会报错。(4)在C语言中,要求对

5、所有用到的变量作强制定义,必须“先定义,后使用”。凡未定义的变量,在编译时将被系统检查出错;每个变量被指定了类型以后就有相应的存储单元;凡未按定义类型进行合法运算的合法运算的,也将在编译时被系统检查出错。3.3 整型数据整型数据3.3.1整型常量的表示方法 整型常量的表示方法有三种: 1)十进制整数。如123, -456, 0; 2)八进制整数。以0开头的数是八进制。如0123, -011; 3)十六进制整数。以0 x开头的数是十六进制数。如 0 x123, -0 x18。3.3.2整型变量 数据在内存中是以二进制形式存放的。微机上使用的C编译系统,每一个整型变量在内存中占用2个字节。例: i

6、nt i; i=10; 0 0 0 0 0 0 0 00 0 0 0 1 0 1 0i实际使用中,整型变量的数值是以补码形式存放的。正数的补码:正数的补码和其原码的形式相同。例: 10 原码 补码负数的补码:绝对值的二进制形式,按位取反再加1 -10 10的原码 取反 再加1得 -10的补码0 0 0 0 0 0 0 00 0 0 0 1 0 1 00 0 0 0 0 0 0 00 0 0 0 1 0 1 00 0 0 0 0 0 0 00 0 0 0 1 0 1 01 1 1 1 1 1 1 11 1 1 1 0 1 0 11 1 1 1 1 1 1 11 1 1 1 0 1 1 02.整型

7、变量的分类整型变量的分类类型比特数最小取值范围备注有符号整型16-32768+32767即 -215(215-1)最高位为符号位无符号整型16065535 即 0(216-1)最高位仍代表数据有符号短整型16-32768+32767即 -215(215-1)最高位为符号位无符号短整型16065535 即 0(216-1)最高位仍代表数据有符号长整型32-2147483648 2147483647即 -231(231-1)最高位为符号位无符号长整型3204294967295即 0 (232-1)最高位仍代表数据3.整型变量的定义整型变量的定义对于变量的定义,一般是放在一个函数的开头部分的声明部分

8、(子函数放在子函数的声明部分)。例3.2整型变量的定义与使用main() int a,b,c,d; /*定义a.b.c.d为整型变量*/ unsigned u; /*指定u为无符号整型变量*/ a=12;b=-24;u=10; c=a+u;d=b+u; printf(“a+u=%d,b+u=%dn”,c,d); 注:不同种类的整型数据可以进行算术运算。 4.整型数据的溢出整型数据的溢出例3.3整型数据的溢出main() int a,b; a=32767; b=a+1; printf(“%d,%d”,a,b); a: 32767 b: -327680 1 1 1 1 1 1 11 1 1 1 1

9、 1 1 11 0 0 0 0 0 0 00 0 0 0 0 0 0 0结果为:32767,-327683.4实型数据实型数据3.4.1实型常量的表示方法实型常量的表示方法 实数(real number)又称浮点数(floating-point number).实数有两种表示形式:(1)十进制小数形式。它由数字和小数点组成。例如 123.450.00.5567(2)指数形式。例:123e4或123E4表示123104。注意:1)E前面必须有数字,后面的必须为整数; 2)规范化表示形式:字母e之前的小数部分中,小 数点前面应有且只能有一位非零的数字;例如: 2.3478e12 3.099e23

10、为规范化表示形式 12.908e10 756e2 0.12e3 为非规范化表示 3.4.2实型变量实型变量1.实型数据的存放形式: 一个实型数据一般在内存中占4个字节(32位)。按照指数形式存储。一般情况下,小数部分占用24位(包括符号位)。指数部分占用8位,采用规范化的指数形式。 例如:3.14159在内存中的存放形式。.3141591符号小数部分.314159小数部分1012.实型变量的分类C实型变量分为单精度(float型)、双精度(double型)和长双精度型(long double型)三类类型比特数有效数字数值范围float326710-371038double64151610-30

11、710308long double128181910-49311049323.实型数据的舍入误差 实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去。由此可能会产生一些误差。例3.4main () float a,b; a=123456.789e5; b=a+20; printf(“%f”,b);理论答案是:12345678920实际答案是:12345678848.0000003.4.3实型常量的类型实型常量的类型通常的C编译系统将实型常量作为双精度来处理。例:一个实型变量f,令: f=2.45678*4523.65 系统首先会把2.45678和452

12、3.65按双精度处理,各 占64位,运算后得到一个双精度的乘积,然后取前7 位赋值给实型变量f.优点:精度高,计算结果更精确;缺点:运算速度降低。解决方法;在数的后面加字母f或F。系统会按单精度处 理。 3.5字符型数据字符型数据3.5.1字符常量 C的字符常量使用单引号括起来的一个字符。如: a b D $D? 转义字符:字符形式含 义ASCII代码n换行,将当前位置移到下一行开头10t水平制表(跳到下一个tab位置)9b退格,将当前位置移到前一列8r回车,将当前位置移到本行开头13f换页,将当前位置一道下页开头12反斜杠字符“”92单引号字符39“双引号字符34ddd1到3位8进制所代表的

13、字符101代表Axhh1到2 位16进制所代表的字符例3.5转义字符的使用main() printf(“ ab ct derftgn”); printf(“htibbj k ”);abcdefghijk3.5.2字符变量字符变量字符变量的定义形式: char c1,c2;说明;1)字符变量只能存放一个字符,每个变量在内存 中只占用一个字节的宽度; 2)上述定义式把c1,c2定义为字符型变量,各可以 存放一个字符;例: c1=a; c2=b; c1=ab3.5.3字符数据在内存中的存储形式及其使用方法字符数据在内存中的存储形式及其使用方法一个字符常量放到一个字符变量中,实际并不是把该字符本身放到

14、内存单元中,而是将该字符的ASCII代码放到存储单元中。例:c1=a实际作用是在变量c1所占用的内存单元中存 放了二进制码01100001;c1c1=a011000011)字符数据与整数的存储形式类似,使得字符型数据和整型数据之间可以通用;2)大小写字母之间转换方便;例3.6向字符变量赋以整数main() char c1,c2; c1=97; c2=98; printf(“%c%cn”,c1,c2); printf(“%d%dn”,c1,c2);a b97 98向字符变量c1,c2赋以整数97,98由此可见,字符型数据和整型数据是通用的。注意:字符数注意:字符数据只占一个字据只占一个字节,它只

15、能存节,它只能存放放0127范围范围内的整数内的整数例3.7大小写字母的转换main()char c1,c2; c1=a; c2=b; c1=c1-32; c2=c2-32; printf(“%c%c”,c1,c2);运行结果: A Ba的ASCII码为97,A为65。b的ASCII码为98,A为68。这是这是C语言中语言中字母实现大小字母实现大小转换的方法。转换的方法。使用相当方便。使用相当方便。3.5.4字符串常量字符串常量字符串常量:字符串常量是一对双引号括起来的字符序列。 例如:“Hello Visual C#”, “China is the greatest country”字符串常

16、量的存储形式:字符串各字符的ASCII码加上结束 字符0。例如: “Hello Visual C#”,“a”HelloVisualC# 0a0注意注意字符常量字符常量a和和字符串常量字符串常量“a”是是不相同的,不相同的,a存存储单元中没有储单元中没有“0”。因此切近。因此切近字符常量和字符串字符常量和字符串常量混用常量混用 3.6变量赋初值变量赋初值nC语言允许在定义变量的同时使变量初始化。例: int a=3; /*指定a为整型变量,初值为3*/ float f=3.56; /*指定b为实型变量,初值为3.56*/ char c=a /*指定c为字符变量,初值为a*/n也可以使被定义的变量

17、的一部分赋初值。例: int a,b,c=5;n如果对几个变量赋予同一个初值,可写成: int a=3,b=3,c=3; 不可以写成:int a=b=c=3; 该式表示a,b,c的初值都是3,并不表示整个程序中a,b,c变量一直相等的,只是初值相同。 3.7各类数值型数据间的混合运算各类数值型数据间的混合运算n不同类型的数据之间进行运算,级别低的向级别高的转换;n转换不需要中间过程,直接转变为高级别数据类型;n上述转换由系统自动进行。doublelongintunsignedfloatcharshort低低高高例:i为整型变量,f为float变量,d为double型变量,e为long型。 10

18、+a+i*f-d/ea转整型,i、f转换为double型,e转换为double型。3.8算术运算符和算术表达式算术运算符和算术表达式3.8.1C运算符简介1.算术运算符 (+ * / %)2.关系运算符 ( = = !=)3.逻辑运算符 ( ! & |)4.位运算符 ( | &)5.赋值运算符 (=及其扩展赋值运算符)6.条件运算符 (? :)7.逗号运算符 ( ,)8.指针运算符 (* &)9.求字节数运算符(sizeof)10.强制类型转换运算符 ( (类型) )11.分量运算符( . )12.下标运算符( )13.其他 (如函数调用运算符)3.8.2算术运算符和算

19、术表达式算术运算符和算术表达式1.基本的算术运算符 (加法运算符,或正值运算符。如3+5、3) (减法运算符,或负值运算符。如52、3) * (乘法运算符。如3*5) / (除法运算符。如5/3) % (模运算符,或称求余运算符,%两侧均应为整型数 据,如7%4为3)说明:两个整数相除的结果为整数,如5/3的结果值为1,舍去小数部分。一般情况下,采用“向零取整”的方法即5/3=1, 5/3=1。如果参加如果参加+ * / 运算的两运算的两个数中为实数,个数中为实数,则结果为则结果为double型型2.算术表达式和运算符的优先级与结合性C语言规定了运算符的优先级和结合性。1)在表达式求值时,先按

20、运算符的优先级别高地次序执行;2)如果在一个运算对象两侧的运算符的优先级别相同,则按规定的结合方向处理;3)C规定了各种运算符的结合方向(结合性),算术运算符的结合方向为“自左至右”,又称“左结合”。有些运算符的结合方向为“自右至左”,即右结合。例: a b + c b符号左边是减号,右边是加号,优先级相等,采用左结合,先a b,然后再c。3.强制类型转换运算符一般形式: (类型名类型名)()(表达式表达式)例: (double)a (将a转换成double类型) (int)(x+y) (将x+y的值转换成整型) (float)(5%3) (将5%3的值转换成float型)表达式应该用括号括起

21、来。例表达式应该用括号括起来。例如如:(int)a+b,只强制转换的只强制转换的a的类型,而不是的类型,而不是a+b的结果。的结果。例:(int) x 如果x原指定为float型,进行强制类型运算后得到一个int型的中间变量,它的值等于x的整数部分,而x的类型不变,仍为float型。例3.8main()float x; int i; x=3.6; i=(int)x;printf(“x=%f,i=%d”, x, i); 注意:在强制类型转换时,得注意:在强制类型转换时,得到一个所需类型的中间变量,到一个所需类型的中间变量,原来变量的类型未发生变化。原来变量的类型未发生变化。最后结果:x=3.60

22、0000,i=34.自增、自减运算符自增、自减运算符作用:作用:使变量的值增使变量的值增1或减或减1.例:例: +i, i (在使用在使用i之前之前,先使,先使i的值加的值加(减减)1) i+, i (在使用在使用i之后之后,使,使i的值加的值加(减减)1) 这两者有很大区别,一个是在这两者有很大区别,一个是在使用之前加使用之前加1,一个是一个是 在在使用之后加使用之后加1;例:例:i=3; printf(“%d”,+i); 结果为输出结果为输出“4” i=3; printf(“%d”,i+); 结果为输出结果为输出“3”注意:注意:1)自增运算符自增运算符(+)和自减运算符和自减运算符()只

23、能只能用于变量用于变量,不能用于常量不能用于常量或或表达示表达示,如,如5 +、(a+b)+皆不合皆不合法;法;2)和和 的结合方式是的结合方式是“自右至左自右至左”。 例如:例如: i+等同于等同于(i+) i3 printf(“%d”, i+) 结果为输出结果为输出3,之后之后i的值变成的值变成4。例:例:printf(“%d,%d”,i,i+); 3.9赋值运算符和赋值表达式赋值运算符和赋值表达式1.赋值运算符赋值运算符赋值符号赋值符号“”就是赋值运算符,它的作用是将就是赋值运算符,它的作用是将一个一个数据数据(常数或表达式的值常数或表达式的值)赋给一个赋给一个变量变量。如:。如:a=3

24、;2.类型转换类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。字符型时,在赋值时要进行类型转换。(1)将将实型实型数据数据(单、双精度单、双精度)赋给赋给整型整型变量时,变量时,舍弃舍弃实数实数的的小数部分小数部分。例如:。例如:i为整型,为整型,i=3.16的结果为的结果为i=3;(2)将整型数据赋给单、双精度变量时,将整型数据赋给单、双精度变量时,数值不变数值不变,但以,但以浮点数形式浮点数形式存储到变量中;存储到变量中;(3)将一个将一个double型型数据赋给数据赋给float变量变量,截取其前面,

25、截取其前面7位有效数字位有效数字,存放到,存放到float变量的存储单元变量的存储单元(32位位),需要,需要注意不要超范围;将一个注意不要超范围;将一个float型型数据赋给数据赋给double变量变量时,时,数值不变,有效位数扩展到数值不变,有效位数扩展到16位位,以,以64位存储位存储;(4)字符型数据赋给整型变量时,由于字符只占字符型数据赋给整型变量时,由于字符只占1个字节,个字节,而整型变量为而整型变量为2个字节,因此将个字节,因此将字符数据字符数据(8位位)放到整放到整型变量型变量低低8位位中。在中。在Turbo C中,若字符的中,若字符的最高位为最高位为0,则整型变量则整型变量最

26、高最高8位补位补0;若;若最高位为最高位为1,则则高高8位补位补1.这称之为这称之为“符号扩展符号扩展”。1 1 1 1 1 1 1 0c=376i:11 1 1 1 1 1 01 1 1 1 1 1 1 1(5)将一个将一个int、short、long型数据赋给一个型数据赋给一个char型变型变量时,只将量时,只将低低8位位原封不动地原封不动地送到送到char型变量型变量(即即截断截断)00 1 0 0 0 0 10 0 0 0 0 0 0 1int i=289char c; c=i00 1 0 0 0 0 1n(6)将带符号的整数数据类型(int)赋给long型变量时,要进行符号扩展,将整

27、型数的16位送到long型的低16位中,若整数数据类型若整数数据类型 的的最高位为最高位为0,则则long变量变量最高最高16位补位补0;若;若最高位为最高位为1,则则高高16位补位补1. 将一个将一个long型数据赋给一个型数据赋给一个int型变量,只将型变量,只将long型型数据中低数据中低16位原封不动送到整型变量位原封不动送到整型变量(即即截断截断)。例:例: int a; long b=8; a=b 0 0 0 0 1 0 0 00 0 0 0 0 0 0 00 0 0 0 1 0 0 0 (7)将将unsigned int型数据型数据赋给赋给long int型型变量,不存变量,不存

28、在符号扩展问题,只需将在符号扩展问题,只需将高位补高位补0即可。将一即可。将一unsigned类型类型数据赋给一个数据赋给一个占字节数相同占字节数相同的整型变量,若字符的的整型变量,若字符的最高位为最高位为0,则整型变量则整型变量最高最高8位补位补0;若;若最高位为最高位为1,则则高高8位补位补1.unsigned型变量的内容型变量的内容原样送到原样送到非非unsigned型型变量中,但如果变量中,但如果数据范围超过数据范围超过相应的整型范围,则会出相应的整型范围,则会出现现数据错误数据错误;(8)将非将非unsigned型数据赋给长度相同的型数据赋给长度相同的unsigned型变型变量,也是

29、量,也是数值位连同符号位原样传送数值位连同符号位原样传送。例:例:main( ) unsigned a; int b=-1; a=b; printf(“%u”,a);11 1 1 1 1 1 11 1 1 1 1 1 1 111 1 1 1 1 1 11 1 1 1 1 1 1 1b的补码a原(补)码 运行结运行结果:果:65535不同类型的整型数据间的赋值归根到底就是一条:按存储单元中的存储形式直接传送。所以:大家一定要好好熟悉原码,补码的概念。最后各位记住:最后各位记住:不同数据类型之不同数据类型之间的赋值出错,间的赋值出错,C C语言的编译系语言的编译系统并不会提示出统并不会提示出错。错。3.复合运算符复合运算

温馨提示

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

评论

0/150

提交评论