1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第二章 数据类型、运算符与表达式,C,语言的数据类型,常量与变量,运算符与表达式,数据类型转换,2.1 C,语言的数据类型,数据类型总表:,C,数,据,类,型,基本类型,构造类型,指针类型,空类型,void,定义类型,typedef,字符类型,char,枚举类型,enum,整 型,实型,单精度型,float,双精度型,double,数组,结构体,struct,共用体,union,短整型,short,长整型,long,整型,int,数据类型决定:,1.,数据占内存字节数,2.,数据取值范围,3.,其上可进行
2、的操作,2.2,常量与变量,2.2.1,常量,在程序运行过程中,其值不能改变的量。,常量有两种存在形式:,直接常量:,如:,1,,,5,,,34,,,-234,等都是整型常量,5.2,,,3.14,,,-34.5,等都是实型常量,A,,,a,,,b,,,!,字符型常量,在下面程序中:,main(),int,a,b,c,;a=23;b=87;,c=,a+b,;,printf(“%dn”,c,);,23,和,87,都是以直接常量形式出现的,符号常量:用一个标识符来代表一个常量。,标识符:,程序设计中用到的变量、符号常量、函数等,都要给他们取个名字,这些变量名、符号常量名、函数名等统称为标识符。,标
3、识符命名规则,:,(,1,)只能由,字母、数字、下划线,组成,并且,名字的第一个字符只能是字母或下划线(即不能是数字)。,(,2,)大小写敏感,(,3,)不能使用关键字(关键字指,c,语言中有特定含义的标识符,如,printf,,,scanf,,,main,,,int,等,),(,4,)长度一般不超过,32,个字符,例:判断下列标识符号合法性,sum Sum,M.D.John,day Date,3days,student_name,#33,lotus_1_2_3,char ab,_above,$123,符号常量的定义形式:,#define,符号常量名 常量,说明:,(,1,)习惯上,符号常量名
4、用大些英文字母,以区分于后面将要介绍的变量名。,(,2,)用,#define,语句定义符号常量时,语句结尾不需要“,;”,,加上分号会出错。,符号常量的使用,:,程序运行时,一旦遇见符号常量,就以定义时符号常,li,量名后面的常量值去替代该符号常量,.,例 符号常量举例,(ch2_1.c),#define PRICE 30,main(),int,num,total;,num=10;,total=PRICE*num;,printf(total,=%d,total);,程序运行时,该条语句变成,total=30*num;,程序运行结果:,total=300,若将上例的符号常量定义语句改为:,#de
5、fine PRICE 30;,,,运行时,,total=PRICE*num;,语句将变成为,:,total=30;*num;,程序出错!,(,3,)符号常量定义语句不能写在,main,函数内部,应写在程序顶部,,main,函数外面。,看程序,写结果,:,#define A 2,#define B 3,main(),int,c;,c=A*B;,printf(“c,=%dn”,c);,c=c+A+B;,printf(“c,=%dn”,c);,c=6,c=11,2.2.2,变量,程序运行过程中,值可以改变的量。,变量不同于常量的是,它一般不直接表示为某一个特定数值,而是对应于内存中的某个存储空间,所
6、以,一个完整的变量包含变量名和变量值两方面含义。,main(),int,a;,a=21;,定义变量,a,实质上是在内存中分配两个字节的空间,并将这两个字节的空间取名为,a,往,a,空间中存入数值,21,,,21,就是,a,变量此时的值,说明:,(,1,)变量必须先定义再使用。如果使用一个未定义的变量,编译时会出现诸如“,undefined symbol”,此类的错误提示。,(,2,)变量定义格式:,类型 变量名,;,如:,int,a,b,c,;float x,y,z;,等,(,3,)变量命名应符合标识符命名规则,2.3,整型数据,2.3.1,整型常量的表示方法,十进制形式:如:,123,,,-
7、456,,,76,等,八进制形式:以,0,开头的八进制数字串。,如:,010,,,026,看程序,写结果:,main(),int,a,b;,a=10;b=010;,printf(“%d,%dn”,a,b,);,10,8,看程序,写结果:,main(),int,a,b;,a=10;b=018;,printf(“%d,%dn”,a,b,);,十六进制形式:以,0 x,或,0X,开头的十六进制数字串。,如:,0 x24,,,0 x2f,等。,结果是多少?,程序出错,,018,不是正确的八进制整数常量形式,2.3.2,整型变量,整型数值在内存中的存放:,众所周知,数据在内存中是以二进制形式存储的。,数
8、据存储可分为有符号数存储和无符号数存储。,有符号数:可以表示正数和负数,有符号数存储时,存储单元的最高位为符号位,最高位为,0,,表示正数;最高位为,1,,表示负数,其余位为数值位。如:,int,a;a=37;,在,turbo c,中,对于,int,型变量,系统会为它分配两个字节的存储空间(,1byte=8bit),0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,符号位,若有:,int,a;a=-37;,又是如何存储的呢?,在,大多数计算机系统中,有符号数存储采用,补码形式,。,数值存储形式:原码、补码。,原码:,+37,:,00000000 00100101,-37,:,10
9、000000 00100101,即:最高位表示符号,其余位表示数值本身的绝对值。,补码:正数的补码和原码一样。所以:,+37,:,00000000 00100101,负数的补码存储形式:,假设,x0,求,x,的补码存储方式:,求,|x|,|x|,的二进制形式 按位取反 末位加,1,问题:已知整数,x,的二进制存储形式,求,x,对应的十进制整数是多少?,无符号数:只能表示,0,和正数,没有符号位,所有数位都表示数值。,整型变量的分类:,基本整型:,int,短整型:,short,长整型:,long,以上三种类型都是有符号数类型,无符号基本整型:,unsigned,int,无符号短整型:,unsig
10、ned short,无符号长整型:,unsigned long,变量的数据类型不同,系统为变量所分配的存储空间的字节数会有所不同,变量的取值范围也会不同。,整型变量的定义与使用,C,语言规定,在程序中要用到的变量必须先定义,变量定义部分一般都放在函数体开始的声明部分。,整型变量的初始化,定义变量的同时给它赋值,如:,int,a=2;,相当于:,int,a;a=2;,整型数据的溢出,基本整型变量的取值范围是:,-32768 32767,有程序:,main(),int,a=32767,b=-32768,c,d;,c=a+1;,d=b-1;,printf(“c,=%d,d=%dn”,c,d);,结果
11、输出:,c=-32768,d=32767,why?,2.4,实型数据,2.4.1,实型常量的表示方法,十进制小数形式:由数字和小数点组成(必须要小数点),如:,34.1,,,0.345,,,34.,,,.23,;但不能只有小数点:,.,不代表,0.0,,是错误形式。,指数形式:,如:,12.3e3,代表,12.3*10,3,,,123e-3,说明:,e,后面的指数部分必须为整常数,不能是小数;,e,前面的尾数部分数值可以是整常数,也可以是实型常数;尾数部分和指数部分均不可省略。,e10,,,1.23e2.5,,,0.5e,都是不合法的浮点数表示。,2.4.2,实型变量,实型变量的分类:,单精度
12、型(,float,),:4byte,双精度型(,double,),:8byte,长双精度型(,long double,),:16byte,(,一般的,turbo c 2.0,版本不支持此类型),单精度类型和双精度类型的区别,除了体现在数据分配的字节数上,还体现在描述数值的,精确度,上。,实型数据在存储时,通常都有一定的,误差,。所以,要判断两个实型数据是否相等,一般不能直接用等于号判断。,例如:,main(),float a=0.2;,if (a=0.2),printf(“yesn,”);,else,printf(“non,”);,程序运行结果:,no,那如何判断呢?我们可以将上面的程序改为:
13、main(),float a=0.2;,if (fabs(a-0.2)3?100:200,表达式值为多少?,已知变量,x,的初始值为,2,,,y,的初始值为,3,,求条件表达式的值以及该语句执行后,x,和,y,变量的值,xy?x+=y:y2?y+=x:y-=x,2.7,不同类型数据间的混合运算,在,计算表达式时,不但要考虑到运算符的优先级和结合性,还要分析运算对象的数据类型。不同类型的数据在一起运算时,需要转换成相同的数据类型。,两种转换方式:,自动转换:编译系统自动完成,转换规则:课本,p38,图,2.7,解释:横向箭头表示必定的转换,纵向箭头表示运算对象类型不同时所作的转换。,赋值类型的自动转换:表达式计算完以后赋值给一个变量是进行的数据类型的转换。,P3839,强制类型转换,形式:(类型名)(表达式,),






