资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,数据类型、运算符和表达式,2,掌握,C,语言的基本数据类型,掌握标识符、关键字、常量和变量的使用,掌握运算符、表达式以及数据类型之间的转换等,掌握简单数据的输入输出,2.1,数据类型,2.1.1,数据类型概述,2.1,数据类型,2.1.2,整数类型,整数类型简称整型,整型数据没有小数部分。,整型可分为:,基本整型:用,int,表示。,短整型:用,short,int,或,short,表示。,长整型:用,long,int,或,long,表示。,2.1,数据类型,2.1.2,整数类型,2.1,数据类型,2.1.3,实型,实数类型简称实型,有时又称浮点数据类型,包括:,单精度浮点数类型:简称浮点类型,类型名为,float,。,双精度浮点数类型:简称双精度类型,类型名为,double,。,长双精度类型:类型名为,long,double,。,2.1,数据类型,2.1.3,实型,2.1,数据类型,2.1.4,字符型,字符类型的数据简称字符型数据,C,语言中用,char,表示,在内存中占一个字节。,字符类型的数据包括计算机所用编码字符集中的所有字符。常用的,ASCII,字符集,共,128,个。扩展的,ASCII,字符集共,256,个字符。,字符数据与整型数据是相似的(除了占用的存储空间不同),2.1,数据类型,2.1.4,字符型,2.2,标识符、常量与变量,2.2.1,标识符,所谓标识符是指程序中的变量、符号常量、数组、函数、类型、文件等对象的名字。,规则,:,由字母、数字和下划线组成,且第一个字符必须为字母或下划线。,大小写敏感。如,Name,和,name,是两个不同的标识符,不能使用系统的关键字,2.2,标识符、常量与变量,建议:,不建议使用系统预定义标识符,如,define,、,include,、,scanf,、,printf,尽量做到“见名知义”,如,max,、,name,等,,不用像,abc,、,a1,、,a2,等标识符。,避免使用易混字符,1,、,l,、,i,;,0,、,o,;,2,、,z,等,2.2,标识符、常量与变量,关键字,2.2,标识符、常量与变量,2.2.2,常量,指在程序运行中其值不能被改变的量。,直接常量:如整型常量、实型常量、字符型常量、字符串常量等。,符号常量:用标识符定义的常量。,2.2,标识符、常量与变量,整型常量,十进制整型常量:同数学上的表示方法,如,168,、,-1,、,65535,等。,八进制整型常量:以,0,开头,由数字,0,7,组成,如,0101,、,-,045,等。,十六进制整型常量:以,0 x,或,0X,开头的数字序列表示十六进制数,如,0 x12,,,2.2,标识符、常量与变量,注意,:,如要说明是无符号类型则在数据后加,u,或,U,、如,65535u,、,168U,等。如果说明为长整型,则在数据后面加,l,或,L,,如,-1L,。,八进制、十进制和十六进制只是整数的不同书写形式,提供多种写法只是为了使用方便,我们可以根据需要选择适当的书写方式。,C,语言中不用二进制形式表示整数。,C,语言中,一般只使用无符号的八进制和十六进制数,而不使用有符号的八进制和十六进制数,因此没有专门的无符号八进制和十六进制标识符。,2.2,标识符、常量与变量,以下是非法的整型常量:,09,:,0,开头应该是八进制,但,9,不是合法的八进制数字。,0X6G,:,0X,开头应该是十六进制,但,G,不是合法的十六进制数字。,以下是合法的整型常量:,00000101,:八进制,相当于十进制的,65,。,-012,:八进制,相当于十进制的,-10,。,65535LU,:十进制,无符号长整型。,0XFF,:十六进制,相当于十进制的,255,。,2.2,标识符、常量与变量,实型常量,实型常量只能用十进制形式表示,表示形式,:,小数形式。由数字序列和小数点组成,如,3.1415926,、,-0.15,、,.15,、,2.,等都是合法的实型常量。,指数形式。由十进制数加上阶码标志“,e,”,或“,E,”,及阶码组成,如,3.14e-4,或,3.14E-4,表示,3.1410,-4,。,2.2,标识符、常量与变量,注意,:,字母,e,或,E,之前的尾数部分必须有数字,例如,E2,是不合法的。,e,或,E,后面的指数部分必须是整数,指数部分无整数或为小数均是错误的,例如,5e,和,5E-5.5,均是不合法的表示。,C,语言中,默认实型常量为,double,类型,若有后缀“,f,”,或“,F,”,,则为,float,类型。,2.2,标识符、常量与变量,字符常量,字符型常量是由一对单引号括起来的单个字符构成,例如,A,、,b,、,8,字符,A,Z,的,ASCII,码值是,65,90,。,字符,a,z,的,ASCII,码值是,97,122,。,字符,0,9,的,ASCII,码值是,48,57,。,空格字符,的,ASCII,码值是,32,。,2.2,标识符、常量与变量,转义字符,2.2,标识符、常量与变量,字符串常量,字符串常量是由一对双引号括起的字符序列,例如,“,1234567,”,、,“,Hello,World,”,等都是字符串常量。,123101,共有,5,个字符占,6,个字节,其中,、,101,分别代表一个字符,输出为,123A,2.2,标识符、常量与变量,符号常量,【,例,2-1】,输入圆的半径,计算周长和面积。,#define,PI,3.14159,void main(),float,r,c,s,;,scanf(%f,&r,);,c=2*PI*r;,s=PI*r*r;,printf(r,=%,f,c,=%,f,s,=%,fn,r,c,s,);,2.2,标识符、常量与变量,2.2.3,变量,在程序运行过程中,其存储的值可以被改变的量称为变量,变量必须通过标识符进行说明,称为变量名。,变量名和内存单元地址存在映射关系,程序可以通过变量名寻址,从而访问其存储的数据。,2.2,标识符、常量与变量,变量的定义和说明,数据类型 变量名,1,变量名,2,变量名,n;,int,i,j,k,;,float,x;,long,a,b,c,;,4,个基本要素:名字、类型、初值和作用域,2.2,标识符、常量与变量,变量名为标识符的一种。,变量的数据类型可以是基本数据类型,也可以是复杂数据类型。,变量的作用域是指变量在程序中有定义的范围,即该变量名在某段代码区域是否有意义。,变量需要赋初值。没有被赋值的变量其初值取决于存储类型,静态存储的变量将自动为,0,,否则被随机初始化。,2.2,标识符、常量与变量,变量赋初值的两种方式,变量说明时直接赋初值,称为变量的初始化,如:,int,a=10,b=9,c=6;,float,x=3.0,y=1.0,z=2.0;,用赋值语句赋初值,如:,float,x;,x,10.0;,2.2,标识符、常量与变量,注意:,编译系统将对每一个变量根据它被定义的类型分配相应的存储单元。变量存储单元地址可用“,&,变量名”求得。,可以用长度运算符,sizeof,(),求出任意类型变量存储单元的字节数。,编译系统根据变量被定义的类型检查该变量进行运算的合法性。,如果没有给变量赋初始值,普通变量将存储随机值,直到给它赋值为止。,2.2,标识符、常量与变量,整型数据的存储,C,语言中的整型数据分为有符号和无符号两大类,unsigned,int,a=65,b=65535,;,int,a=65,b=32767,c=-1,;,2.2,标识符、常量与变量,补码(,complement,),假设,int,型整数,a,占,2,字节,,16,位二进制数,2.2,标识符、常量与变量,2,字节的,int,型整数的补码,2.2,标识符、常量与变量,负数的转换步骤如下:,32768,取绝对值,如,|-32768|,等于,32768,2,16,-|a|,,如,2,16,-|-32768|,等于,65536 32768,等于,32768,转换成二进制,如,10000000 00000000,(,32768,等于,2,15,),2.2,标识符、常量与变量,补码形式还原成十进制的步骤正好相反,11111111,11111110,转换成十进制:,65534,2,16,-65534,65536-65534,2,加负号,-2,2.2,标识符、常量与变量,实型数据的存储,字符数据的存储与使用,2.2,标识符、常量与变量,【,例,2-2】,演示字符数据的存储和引用。,#include,void main(),char c;,int,i;c=A;,i=c;,printf(c,=%,d,c,=%,cn,c,c);,printf(i,=%,d,i,=%,cn,i,i);,c=c+32;,printf(c,=%,cn,c,);,c=0 x80;,printf(c,=%,c,c,=%,dn,c,c);,2.2,标识符、常量与变量,溢出与舍入误差,数据的溢出,char,c=127;c=c+1;,2.2,标识符、常量与变量,【,例,2-3】,演示数据的溢出。,#include,void main(),char c=127;long,li,=2147483647;,unsigned,uc,;unsigned long,uli,;,printf(c,=%d,li,=%ldn,c,li,);,c=c+1;li=li+1;,printf(c,=%d,li,=%ldn,c,li,);,c=127+100;,li,=2147483647+100;,printf(c,=%d,li,=%ldn,c,li,);,uc,=127+100;,uli,=2147483647+100;,printf(uc,=%d,uli,=%ldn,uc,uli,);,printf(uc,=%u,uli,=%,lun,uc,uli,);,2.2,标识符、常量与变量,实型数据的误差,整数存储除了溢出以外是没有误差的。,实型数据由于是用有限的存储单元存储较大范围的实型数,有效数字是有尾数限制的,在实际计算和引用中会有很多问题。,2.2,标识符、常量与变量,【,例,2-4】,演示实型数据的误差。,#include,void main(),float x,y;,x=1234567890000000000.0;,y=x+0.12345;/*,大数加上一个小数,小数被忽略*,/,printf(x,=%f,y=%,fn,x,y);,x=3.1415926;,y=x-0.0001;/*,小数的有效位加,1,有效*,/,printf(x,=%.3f,y=%.3fn,x,y);,y=x+0.0000005;/*,小数的无效位加,1,也无效*,/,printf(x,=%.7f,y=%.7fn,x,y);,2.3,运算符与表达式,13,类,45,个运算符,2.3,运算符与表达式,2.3,运算符与表达式,学习运算符要注意以下几方面问题,运算符的功能。,运算符与操作对象即操作数(包括常量、变量、函数调用等)的关系:,操作数的个数(单目、双目、三目)。,求操作数的类型(如求余运算符,%,要求操作数是整型)。,结合方向,运算符的优先级。,运算结果的数据类型,运算符连接操作数形成的式子叫表达式。,2.3,运算符与表达式,2.3.1,算术运算符与算术表达式,+,(加)、,-,(减)、*(乘)、,/,(除)、,%,(取模,或称求余运算符)。,双目运算符,结合方向均为从左到右。,%,(取模)运算符仅用于整型变量或整型常量的运算,,a%b,结果为,a,除以,b,的余数,余数的符号与被除数相同,如:,7%3,的值为,1,;,17%-3,的结果为,2,;,-19%4,的结果为,-3,。,+,、,-,、*、,/,运算符的两个操作数既可以是整数,也可以是实数。,/,(除法)运算符,当对两个整型的数据相除时为整除操作,2.3,运算符与表达式,强制类型转换(显式转换)运算符:(类型),例如:,(,double)a,(,int)(x+y,),(float)5/3,表达式一定要加括号(因强制类型转换是单目运算,优先级高),例如上面最后一个表达式中只是将,5,转变成,float,型,而不是将,5/3,转变成,float,型。,若对变量实型显式转换,将得到新类型的一个值,原变量的类型及其存储值均不变。,2.3,运算符与表达式,【,例,2-5】,演示强制类型转换。,#include,void main(),int,i;float f;,f=3.1415926;,printf(i,=%,d,f,=%,fn,i,f,);,i=(,int,)f;,printf(i,=%,dn,i,);,f=5/3;,printf(f,=%,fn,f,);,f=(float)5/3;,printf(f,=%,fn,f,);,printf(f,=%,dn,f,);/*,实数按整型数方式输出*,/,printf(i,=%,fn,i,);/*,整型按实数方式输出*,/,2.3,运算符与表达式,自增自减运算符:,+,和,单目运算符,右结合,作用对象必须是变量,前缀运算,int,i=5,j;j=,+,i;,j,等于,6,。,后缀运算,int,i=5,j;j=i,+,;,j,等于,5,。,2.3,运算符与表达式,【,例,2-6】,输出下面程序中,i,、,j,的值。,#include,void main(),int,i=5,j;j=+i+i+;,printf(i,=%,d,j,=%,dn,i,j,);,i=5;j=(+,i)+(+i)+(i,+);,printf(i,=%,d,j,=%,dn,i,j,);,i=5;,printf(i,+=%,d,i,+=%,dn,i+,i,+);,printf(i,=%,dn,i,);,i=5;,printf(+i,=%,d,+i,=%,dn,+i,+i,);,printf(i,=%,dn,i,);,i=5;j=6;,printf(i+j,=%,d,j,+=%,dn,i+j,j,+);,printf(i,=%,d,j,=%,dn,i,j,);,i=5;j=6;,printf(i+j,=%,d,j,+=%,dn,i+j,+j,);,printf(i,=%,d,j,=%,dn,i,j,);,2.3,运算符与表达式,说明:,左边是,TC,下的运行结果,右边是,VC,下的运行结果。,二者不同之处在于,printf,函数输出时,,VC,下后面参数的后缀,j+,、,i+,是在所有参数处理完毕后才起作用,而,TC,下,后缀的自增和自减将影响到该参数前面的参数处理。,2.3,运算符与表达式,2.3.2,赋值运算符与赋值表达式,变量,=,表达式,“,=”,是赋值运算符,不同于等号(等号是,=,)。,右结合,int,a,b;a,=b=100;,连续赋值,只有最后一步有效。例如:,int,a;a,=100;a=200;,赋值运算符的优先级较低(只高于逗号运算符),因此一般情况下表达式无须加括号。例如:,a=2+5/3,相当于:,a=(2+5/3),赋值运算可以构成一个表达式,其值可以再赋给其他变量。例如:,a=b=100;,其实相当于:,a=(b=100);,2.3,运算符与表达式,复合赋值运算符,+=,、,-=,、*,=,、,/=,、,%=,、,=,、,&=,、,=,和,|=,a+=100,;等价于,a=a+100,;,a*=b,;等价于,a=a*b,;,简化程序,使程序精练;,提高编译效率,产生质量较高的目标代码。,2.3,运算符与表达式,2.3.3,算术表达式的书写,(-,b+sqrt(b,*b-4*a*c)/(2*a),设有变量声明,float a=3.0;,int,b=2;,计算表达式,2+sqrt(1.0+a)*b+/2,。,解:,2+sqrt(1.0+a)*b+/2,2+sqrt(4.0)*b+/2,2+2.0*2/2,2+4.0/2,2+2.0,4.0,2.3,运算符与表达式,2.3.4,逗号运算符与逗号表达式,(,表达式,1),(,表达式,2),(,表达式,3),(,表达式,n),表达式,n,的值就是整个逗号表达式的值。,【例,2-7】,演示逗号表达式。,#include,void main(),int,a;,printf(1+2+3+4+5=%,dn,(a=1,a=a+2,a=a+3,a=a+4,a=a+5);,printf(a,=%,dn,a,);,2.4,数据类型转换,2.4.1,类型转换概述,不同类型数据的存储长度和存储方式不同,一般不能直接混合运算。为了提高编程效率,增加应用的灵活性,,C,语言允许不同数据类型相互转换。,不同数据类型的差异,double,比,float,高级。,实数比整数高级。,整数中长的比短的高级,如:,long,int,shortchar,无符号(,unsigned,)比有符号(,signed,)高级,2.4,数据类型转换,数据类型转换产生的效果,数据类型级别的提升与降低,符号位扩展与零扩展,截去高位产生数值的变化,丢失精度,实数转换成整数时,由于截去小数将丢失精度。,double,型转换成,float,型时,有效数字减少(四舍五入),精度丢失。,long,型转换成,float,型时,由原来可达,10,位整数变成只有,7,位有效数字,精度丢失,但由于数的范围扩大了,数据类型从较低级提升到较高级,2.4,数据类型转换,自动类型转换,float,在运算时自动转换成,double,。,char,和,short,在运算时自动转换成,int,。,int,和,unsigned,混合运算时,将,int,转换成,unsigned,数据。,int,或,unsigned,与,long,混合运算时,都转换成,long,数据。,int,、,unsigned,、,long,与浮点型数据混合运算时,都转换成,double,2.4,数据类型转换,2.4.3,赋值类型转换,赋值运算时,如果赋值运算符两侧的类型(指基本类型)不一致,系统自动将表达式的值转换成变量的类型存到变量的存储单元中,整型数据赋给实型变量时,数值上不发生任何变化。如:,float,f;f=100;,实型数据赋给整型变量时,小数部分将被舍弃。如:,int,a=3.1415;/*,内存中变量,a,的值为,3*/,短的有符号整型数据赋给长整型变量时,需要进行符号位扩展。,短的无符号的整型数据赋给长整型变量时,需要进行,0,扩展。,则,i,的值为,-1,。,2.4,数据类型转换,长整型数据赋给短的整型变量时,有可能溢出。如:,char,c=321;,溢出后,c,的值为,A,。,同长度有符号整型数据赋给无符号整型变量时,数据将失去符号位功能。如:,unsigned,char,c=-1;,则,c,的值为,255,。,同长度无符号整型数据赋给有符号整型变量时,数据将得到符号位功能。如对于,16,位,int,:,int,i=65535u;,2.4,数据类型转换,2.4.4,强制类型转换,强制类型转换的格式为:,(,类型名,)(,表达式,),强制类型转换用于不能自动转换的情况。例如:,(,int,)5.0%3 /*,实型数据求余运算*,/,(,int,)(f+0.5)/*,第一位小数的四舍五入算法*,/,(,int,)(f,*10+0.5)/10.0/*,第二位小数的四舍五入算法*,/,2.5,程序举例,【,例,2-8】,编写程序将输入的华氏温度转换为摄氏温度,输出结果精确到小数点后两位。转换公式为:,C=5/9*(F 32),#include,void main(),float,temprature,;,printf(Input,F:);,scanf(%f,&temprature,);,temprature,=(temprature-32)*5/9;,printf(C,=%.2fn,temprature);,【,例,2-9】,汽车在有里程标志的公路上行进。输入开始和结束的里程及时间(以时、分、秒输入),计算并输出平均速度(公里数,/,小时),#include,main(),int,StartPost,EndPost,;,int,StartHour,StartMinute,StartSecond,;,int,EndHour,EndMinute,EndSecond,;,int,ElapsedTS,ElapsedHour,ElapsedMinute,ElapsedSecond,;,double,ElapsedTime,Velocity,;,int,Distant;,printf(Input,StartPost,:);,scanf(%d,&StartPost,);,printf(Input,Begin Time:);,scanf(%d,%d,%d,&StartHour,StartMinute,&,StartSecond,);,printf(Input,EndPost,:);,scanf(%d,&EndPost,);,printf(Input,End Time:);,scanf(%d,%d,%d,&EndHour,&,EndMinute,&,EndSecond,);,ElapsedTS,=(,EndHour,*3600+,EndMinute,*60+,EndSecond,)(,StartHour,*3600+,StartMinute,*60+,StartSecond,);,ElapsedHour,=,ElapsedTS,/3600;,ElapsedMinute,=,ElapsedTS,%3600/60;,ElapsedSecond,=,ElapsedTS,%60;,ElapsedTime,=,ElapsedHour,+,ElapsedMinute,/60.0+,ElapsedSecond,/3600.0;,Distant=,EndPost,-,StartPost,;,Velocity=Distant/,ElapsedTime,;,printf(Distant,is:%,dn,Distant,);,printf(Elapsetime,is:%d,Hour%d Minute%d Secondn,ElapsedHour,ElapsedMinute,ElapsedSecond,);,printf(Velocity,is:%f,km/hour,n,Velocity,);,C,语言的数据类型。,C,语言的数据类型有,4,类:基本类型、构造类型、指针类型和空类型。,基本数据类型包括整型、实型、字符型,3,种。它们的表示方法、数据的取值范围等各有特点。,常量和变量。,常量指在程序运行中其值不能被改变的量,包括整数、长整数、无符号整数、浮点数、字符、字符串、符号常量等。其中特别要注意字符和字符串的区别。,变量是指在程序运行过程中其值可以被改变的量,包括各种整型、实型、字符型等。,变量的名称可以是任何合法的标识符,但不能是关键字。给变量命名时应尽量做到“见名知义”。,C,语言共有,13,类运算符。,运算符主要有算术运算符(包括自加、自减运算符)、关系运算符、逻辑运算符、条件运算符、位运算符、赋值运算符和逗号运算符等。,每种运算符运算对象的个数、优先级、结合性也各有不同。一般而言,单目运算符优先级较高,赋值运算符优先级较低。大多数双目运算符为左结合性,单目、三目及赋值运算符为右结合性。,表达式。,表达式是由运算符连接各种类型的数据(包括常量、有值变量和函数调用等)组合而成的式子。表达式的求值应按照运算符的优先级和结合性所规定的顺序进行。,数据类型转换。不同类型的数据在进行混合运算时,需要进行类型转换。类型转换有,3,种方式:,自动类型转换。当不同类型的数据进行混合运算时,按照“精度”不降低的原则从低级向高级自动进行转换。,赋值类型转换。当赋值运算符两侧的类型不一致时,将表达式值的类型转换成变量的类型再赋给变量。,强制类型转换。当希望将一个表达式强制转换成所需类型时可进行强制类型转换。,在自动类型转换中,,float,自动转换成,double,,,char,和,short,自动转换成,int,进行计算,而不管是否存在混合类型的运算。在程序设计中要合理使用数据类型,避免数值的变化和精度的丢失。,下面程序的输出是,_,。,#include,void main(),int,a=10,b=10;,printf(%d,%d,%d,%dn,a-,a,-,b,b,);,下面程序的输出是,_,。,#include,void main(),int,i=1,j,k;,j=i+;,printf(j,=%,d,i,=%,dn,j,i,);,k=+i;,printf(k,=%,d,i,=%,dn,k,i,);,j=i-;,printf(j,=%,d,i,=%,dn,j,i,);,k=-i;,printf(k,=%,d,i,=%,dn,k,i,);,i=j=5;,printf(i+j,=%,d,+j,=%,dn,i+j,+j,);,
展开阅读全文