资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,3,章 数据类型、运算符与表达式,3.1 C,语言的数据类型,3.2,常量与变量,3.3,整型数据,3.4,浮点型数据,3.5,字符型数据,3.6,变量赋初值,3.7,各类数值型数据间的混合运算,3.8,算术运算符和算术表达式,3.9,赋值运算符和赋值表达式,3.10,逗号运算符和逗号表达式,3.1 C,语言的数据类型,处理同一类问题,如果数据结构不同,算法也会不同,C,语言提供了以下一些数据类型,由这些数据类型可以构造出不同的数据结构。,数据类型,基本类型,构造类型,指针类型,空类型,整型,字符型,浮点型,枚举类型,数组类型,结构体类型,共用体类型,单精度型,双精度型,程序中用到的所有数据都必须指定其数据类型,数据有常量和变量之分,他们分别属于以上这些类型。例如整型数据包括整型变量。,利用以上数据类型还可以构成更复杂的数据结构,如数组、树、栈等,3.2,常量与变量,3.2.1,常量和符号常量,在程序运行过程中,其值不能被改变的量称为常量。常量区分为不同的类型,如,12,,,0,,,-3,为整型常量,,4.6,、,-1.23,为实型常量,,a,,,d,为字符常量。常量一般从其字面形式即可判别。这种常量称为字面常量或直接常量。也可以用一个符号,用一个标识符代表一个常量,称为符号常量,即标识符形式的常量。注意符号常量与变量的不同,符号常量的值在其作用域内不能改变,也不能再被赋值。,【,例,3.1】,符号常量的使用。,#define PRICE 30,#include,void main(),int,num,total;,num=10;,total=num*PRICE;,printf(“total,=%dn”,total);,程序中用,#define,命令行定义,PRICE,代表常量,30,,此后凡在本文件中出现的,PRICE,都代表,30,,可以和常量一样进行运算。,Define,命令在第九章中详细介绍,使用符号变量有如下好处:,(,1,)含义清楚,total=num*PRICE,可以清楚的知道,total,的值 代表数量*价格,若,total=15*20.3,其中,15,、,20.3,的意义不清楚,(,2,)在需要改变一个常量时能够做到“一改全改”,例如程序中有,10,处价格,需要改动,10,处,用符号变量只需要改动一处。,3.2.2,变量,其值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元。在该存储单元中存放变量的值。变量名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址。在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。,用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列称为标识符,(identifier),。,简单地说,标识符就是一个名字。,C,语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。,如:,sum average _tatal class day month student_name,basic li_ming,错误的标识符:,M.D.Jone#33 3d64 ab,注意:大、小写字母被认为是不同的字符,,一般习惯:变量名用小谢子母表示,ANSIC C,不规定标识符长度,但各,C,编译系统中有规定,有的只认前,8,格,,Turbo C,可认,32,个,为了程序的可移植性,建议变量名的长度不超过,8,个字符,取标识符应注意做到“见名知意”。,在,C,语言中,要求对所有用到的变量作强制定义,也就是“先定义,后使用”,目的如下:,(1),凡未被事先定义的,不作为变量名,这就能保证程序中变量名使用得正确。,如,int student,使用时写成,stadent=30;,系统会报错,(2),每一个变量被指定为一确定类型,在编译时就能为其分配相应的存储单元。,(3),指定每一变量属于一个类型,这就便于在编译时,据此检查该变量所进行的运算是否合法。,如,a%b,若,a,b,整型,允许,若,a,b,有一实型,不允许,3.3,整型数据,3.3.1,整型常量的表示方法,整型常量即整常数,可用以下三种形式表示:,(1),十进制整数:,123,,,-456,,,4,(2),八进制整数:,0123 -011,(3),十六进制整数:,Ox123 Ox2A,3.3.2,整型变量,1.,整型数据在内存中是以二进制形式存放的。,如果定义了一个整型变量,i,:,int,i;/*,定义为整型变量*,/,i=10;/*,给,i,赋以整数,10*/,图,3.2(a),是数据存放的示意图。图,3.2(b),是数据在内存中实际存放的情况。,图,3.2,数据在内存中的存放,整数以补码方式存放。正数的补码即原码,负数补码:将该数的绝对值的二进制形式,按位 取反,末位加,1,如,i=-10,取,-10,的绝对值,10,;,10,的二进制形式为,1010,按位取反得:(共,16,位),1111111111110101,在加,1,得,1111 1111 1111 0110,所以,-10,的存放 是,10,i,i,(a),(b),0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,2.,整型变量的分类,有以下三种整型变量:,(1),基本整型,以,int,表示。,(2),短整型,以,short int,表示,或以,short,表示。,(3),长整型,以,long int,表示,或以,long,表示,一个,int,型的变量值的范围为,-2,15,(2,15,-1),,即,-,3276832767,。在实际应用中,变量的值常常是正的。对以上,3,类都加上修饰符,unsigned,,,以指定是“无符号数”,加上修饰符,signed,,,则指定为“有符号数”。归纳起来,可以用以下,6,种整型变量。即:,有符号基本整型,signed,int,;,无符号基本整型,unsigned,int,;,有符号短整型,signed short,int,;,无符号短整型,unsigned short,int,;,有符号长整型,signed long,int,;,无符号长整型,unsigned long,int,。,16,位机器,short,与,int,等长,long 32,位,32,位机器,long,与,int,等长,不需要,short,3.,整型变量的定义,int,a,b;(,指定变量,a,、,b,为整型,),unsigned short c,d;(,指定变量,c,、,d,为无符号短整型,),long e,f;(,指定变量,e,、,f,为长整型,),【,例,3.2】,整型变量的定义与使用。,#include,void 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);,运行结果为:,a+u=22,b+u,=-14,可以混合计算,只要不超出范围即可,4.,整型数据的溢出,在,Turbo C,和,Turbo C+,中一个,int,型变量的最大允许值为,32767,,如果再加,1,,会出现什么情况呢?,【,例,3.3】,整型数据的溢出,(,见图,3.6),。,#include,void main(),int,a,b;,a=32767;,b=a+1;,printf(“%d,%dn”,a,b,);,运行结果为:,32767,,,-32768,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a:,b:,32767,-32768,图3.6,3.3,整型常量的类型,若一个整型常量大小在,-32768-32767,之间,则为,int,型,若再,-2147483684-2147483647,之间,则为,long,型,Turbo C,中,,int,型与,short,相同,如,12345u,则认为是,unsigned,型,则写成,-12345u,则先将,-12345,转换成其补码,53191,,然后按无符号数存储,12345L,或,12345l,则是,long,常量,3.4,浮点型数据,3.4.1,浮点型常量的表示方法,C,语言中的浮点数,(floating point number),就是平常所说的实数,(real number),。,浮点数有两种表示形式:,(1),十进制小数形式。它由数字和小数点组成,(,注意必须有小数点,),。,0.123,、,123.,、,123.0,、,0.0,都是十进制小数形式。,(2),指数形式。如,123e3,或,123E3,都代表,12310,3,。但注意字母,e(,或,E),之前必须有数字,且,e,后面的指数必须为整数,如,e3,、,2.1e3.5,、,e3,、,e,等都不是合法的指数形式。,1.23456e2,称为规范化的指数形式,即小数点左边有一位且只有一位非零的数字,若指定实数按指数形式输出,则输出的形式为:,5.68965e+003,,而不会是,0.568965e+004,或者,56.8965e+002,3.4.2,浮点型变量,1.,浮点型数据在内存中的存放形式,一个浮点型数据一般在内存中占,4,个字节,(32,位,),。与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。系统把一个浮点型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的指数形式。各部分占多少位由各系统定,一般系统中,小数部分,24,位,指数部分,8,位(含符号),小数部分愈多,数越精确;指数部分越多,数的范围越大。实数,3.14159,在内存中的存放形式可以用图,3.7,示意。,图3.7,+,.314159,1,数符,小数部分,指数,+,.314159,10,1,3.14159,2.,浮点型变量的分类,浮点型变量分为单精度,(,float,型,,32,位,,6-7,位有效数字,),、双精度,(,double,型,,64,位,15-16,位有效数字,),和长双精度型,(long,double,,,128,位,18-19,位有效数字,),三类。例如:,float,x,y;(,指定,x,、,y,为单精度实数,),double z;(,指定,z,为双精度实数,),long double t;(,指定,t,为长双精度实数,),有的系统将,double,增加到,32,位全部用于存放小数部分,利于精确;有的系统将,32,位中的一部分用于存放指数部分,表示范围增大,对每一个浮点型变量都应在使用前加以定义。,float x,y;double z;long double t,(很少用),;,3.,浮点型数据的舍入误差,由于浮点型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去。由此可能会产生一些误差。,【,例,3.4】,浮点型数据的舍入误差。,#include,void main(),float a,b;,a=123456.789e5;,b=a+20;,printf(“%fn”,b,);,运行程序得到的,a,和,b,的值都是,12345678848.000000,3.4.3,浮点型常量的类型,都是双精度类型,f=2.45678*4523.65,二数都为双精度,算完后取前几位赋给,f,,,f,为,float,型,速度较慢,若在数后加,f,或,F,,这样常量就按,32,位处理,速度快,一个浮点型常量可以赋给一个,float,型、,double,型、,long double,型变量,作相应截取。,float a;a=111111.111,实际,a=1111111.1
展开阅读全文