资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,C,程序设计与应用教程,数据类型和表达式,本章要点,C,语言的数据类型,常量和变量,简单的输入输出,算术、赋值及逗号运算表达式,不同类型数据之间的混合运算,2.1 C,语言的数据类型,2.2,常量,2.3,变量,第,2,章,数,据,类,型,和,表,达,式,目录,2.4,简单的输入输出,2.5,算术运算符和算术表达式,2.6,赋值运算和赋值表达式,2.7,逗号运算和逗号表达式,2.8,不同类型数据之间的混合运算,一个程序应该包括两方面的内容:待处理数据的描述和处理过程的描述。,数据是程序处理的对象,计算机将要处理的数据依据其本身的特点进行分类,不同类型的数据有不同的存储空间、存储方式及处理方法。,C,语言的数据类型如下,整型,数据类型,基本类型,字符型,浮点型,枚举,空类型,(void),构造类型,数组,结构体,联合体,指针,2.1 C,语言的数据类型,C,语言中,除,void,类型外,其它基本类型代表了数据在计算机中的不同存储形式,它们占用的内存空间大小不同,能表示的数据范围或数据精度不同。,char,:占,1,个字节,通常用来存放一个字符的,ASCII,码值。,int,:在,16,位系统中占,2,个字节;在,32,位系统中占,4,个字节。,float,:占,4,个字节。,每种数据类型所占的字节数可以通过,sizeof,运算符求得,具体的使用格式是:,sizeof,(,数据类型,),。,类型符,字节,表数范围,char(signed char),1,-128,127,unsigned char,1,0,255,short(signed short),2,-32768,32767,unsigned short,2,0,65535,int,(signed,int,),2,-32768,32767,unsigned,int,2,0,65535,long(signed long),4,-2147483648,2147483647,unsigned long,4,0,4294967295,float,4,-3.410,38,3.410,38,double,8,-1.710,308,1.710,308,long double,8,-1.710,308,1.710,308,表,2-1,基本数据类型与类型修饰符的可能组合,2.2,常量,所谓的常量是指在整个程序运行过程中,其值始终不可改变的量,也称为字面上的常量,它不占用独立的存储空间。,常量有整型常量、实型常量、字符常量、字符串常量等多种,还可定义符号常量。,2.2,常量,2.2.1,整型常量,2.2.2,实型常量,2.2.3,字符常量,2.2.4,字符串常量,2.2.5,符号常量,2.2,常量,2.2.1,整型常量,整型常量是不带小数的整数,包括正整数、负整数和零。,十六进制常量:,0 x,若干个,0,9,的数字及,A,F,的字母(不分大小写)。例如,,0 x12E4,0Xff47,。,八进制常量:,0,若干个,0,7,的数字。,例如,,745,-0417,。,长整型常量:整型常量后面缀上字母“,L”,。例如,,123L,无符号整型常量:整型常量后面缀上字母“,U”,例如,,12U,。,2.2,常量,2.2.2,实型常量,包含小数部分的数值称为浮点数,有两种形式:一般形式和指数形式。,一般形式:由数字和小数点组成(注意必须有小数点)。例如,,0.32,、,.98,、,34.,、,123.5,。,指数形式:在一般形式表示的小数后面加上字母,e,(或,E,),然后再跟一个,1,3,位的称为指数部分的整数,例如,,25.,4e3,,表示,25.4103,;,0.257E5,,表示,0.257105,。,2.2,常量,2.2.3,字符常量,在内存中,字符型数据是以,ASCII,码存放的,一个字符占一个字节。,在书写格式上,字符常量有两种表示方法:,(,1,)对可显示的字符,直接用单引号将该字符括住,例如,z,、,4,、,#,等。,(,2,)对不可显示字符,以及在,C,语言中有特殊含义和用途的字符(如单引号、双引号、反斜杠等),则用单引号括住一个,转义序列,。所谓的转义序列是由反斜杠后跟某个字母组成的。,2.2,常量,2.2.3,字符常量,表,2-2,转义序列表,转义序列,ASCII,码(十进制),说明,转义序列,ASCII,码(十进制),说明,0,0,空字符,t,9,水平制表符(,TAB,),a,7,响铃报警,v,11,垂直制表符,b,8,退格符,92,反斜杠,n,10,换行符,39,单引号,r,13,回车符,34,双引号,2.2,常量,2.2.3,字符常量,实际上无论是可显示字符还是不可显示字符,都可以用八进制或十六进制的,ASCII,码值来表示,表示形式如下:,八进制形式:,nnn,,其中,nnn,表示,1,3,位的八进制数。,例如,,n,可以表示为,15,。,十六进制形式:,xnn,(,x,只能小写,不能大写),其中,nn,表示,1,2,位的十六进制数。,例如,,n,可以表示为,xD,。,2.2,常量,2.2.4,字符串常量,字符串常量是以双引号括起来的字符序列。,例如,“,This is a test”,是一个字符串常量。,2.2,常量,2.2.4,字符串常量,存储时,按字符串中字符从左到右的顺序依次占用连续的存储单元,每个字符占用一个字节,存放其对应的,ASCII,码。,C,编译器会自动在每个字符串常量的末尾加上一个空字符,NULL,(即,0),作为结束标志。例如,字符串常量“,China”,中含有,5,个字符,它在内存中要占用,6,个字节,即:,C,h,i,n,a,0,2.2,常量,2.2.4,字符串常量,注意,:,字符串的长度和字符串的存储长度不同,例如,:”china”,的长度是,5,,存储长度是,6,。,A,字符常量,“,A”,字符串常量,2.2,常量,2.2.5,符号常量,符号常量,即用一个符号(标识符)来代表一个常量。,1,宏定义,2,const,限定,2.2,常量,2.2.5,符号常量,1,宏定义,宏定义是用指定的标识符来代表一个字符序列,一般形式为:,#define,标识符 字符序列,例如,在求圆面积的程序中可以为,定义一个符号常量。,#define,PI 3.1415926,2.2,常量,2.2.5,符号常量,特别说明,#define,不是,C,语言的语句,而是编译系统的预处理命令,命令末尾没有分号。,为了便于与一般变量名相区别,通常用大写字母来表示符号常量。,符号常量没有类型的含义。,2.2,常量,2.2.5,符号常量,2,const,限定,可以在变量声明中加上常量修饰符,const,来说明常量。对于用,const,说明过的变量,在程序执行期间其值不能被修改,但可以给它们赋初始值,这称为,const,限定,其一般形式为:,const,数据类型 符号常量,=,常量;,例如,:,const,double pi=3.1415926;,2.3,变量,变量是在程序处理过程中其值会变化的量。变量有自己独立的存储空间,即变量是存储空间的抽象。,2.3,变量,2.3.1 C,标识符及其命名,2.3.2,变量的声明及其初始值问题,2.3,变量,2.3.1 C,标识符及其命名,1,C,标识符,C,语言规定:变量、数组、函数、类型及文件名等各种用户定义的名字均为标识符,标识符是一个对象的名字。,123LC,语言的标识符可以由一个或多个字符组成,但第一个字符必须是字母或下划线,其它部分为由字母、数字或下划线组成的字符序列。,注意:,关键字不能用作用户标识符。,C,语言中大写字母和小写字母是有区别的,所以,count,Count,COUNT,是三个不同的标识符。,2.3.1 C,标识符及其命名,对于标识符的长度,大多数,ANSI,编译系统(如,TC,)规定前,31,个字符有效,2.3,变量,2.3,变量,2.3.1 C,标识符及其命名,2,标识符的命名,数据类型,前缀,例子,char,c,cInChar,int,i,iReturnValue,long,l,lNumRecs,string,sz,szInputString,int,array,ai,aiErrorNumber,char *,psz,pszInputString,表,2-4,一些常用的匈牙利命名法前缀,变量有变量名和变量值之分,变量的一种形象描述如图,2-1,所示,,2.3.2,变量的声明及其初始值问题,15,存储单元,x,变量名,变量值,图,2-1,变量示意图,int,x;,x=15;,2.3,变量,变量声明格式如下:,2.3.2,变量的声明及其初始值问题,数据类型 变量名表;,数据类型:如表,2-1,所描述的基本数据类型。,变量名表列:可以用逗号分隔多个变量名。例如:,2.3,变量,2.3.2,变量的声明及其初始值问题,图,2-2,变量占存储空间示意图,x,y,z,a,b,c,例如:,int,x,y,;,float z;,char,a,b,c,;,把内存想象成一排排有门牌号的房间,每个字节是一个房间。不同数据类型的变量占据不同的房间数。在,16,位系统中,上面三行定义变量的语句的结果如图,2-2,所示。,2.3,变量,2.3.2,变量的声明及其初始值问题,变量必须“先定义,后使用”。变量声明语句的位置一般在函数体的开始部分。变量声明后,将获得一定字节数的存储空间,并可以在该存储空间中存储数据。,2.3,变量,2.3.2,变量的声明及其初始值问题,将一个数据存储在变量中有多种实现方式,:,通过赋值运算实现,例如:,int,x;/*,先定义*,/,x=15;/*,后赋值*,/,在定义变量的同时赋给变量相应的值,称为变量的初始化。例如:,int,x=15,y=15;,2.3,变量,2.3.2,变量的声明及其初始值问题,将一个数据存储在变量中有多种实现方式,:,利用后面介绍的输入函数,scanf,(),给变量赋值。在程序运行期间,暂停程序的运行,等待用户从键盘输入一个数据,使得该变量获得一个值。例如:,int,x;,scanf,(“,%d”,&x,);,2.3,变量,2.4,简单的输入输出,输入输出是对计算机主机而言的。所谓输入,是指从输入设备(如键盘)向计算机输入待处理数据的过程;所谓输出,是指计算机将处理的结果向外部输出设备(如显示器、打印机等)输出的过程。,2.4,简单的输入输出,C,语言本身没有提供输入输出语句,它的输入输出是通过,C,函数来实现的,,C,标准函数库中提供了一批用于处理输入输出的函数,例如,getchar,(),、,putchar,(),、,scanf,(),、,printf,(),等。在使用这些输入输出函数之前,要在源程序的前面加上一条编译预处理命令:,#include,2.4,简单的输入输出,2.4.1,字符型数据的输入输出函数,2.4.2,简单的格式化输入输出函数,2.4,简单的输入输出,2.4.1,字符型数据的输入输出函数,1,字符输出函数,putchar,(),putchar,(),函数的作用是向标准输出设备(指显示器)显示输出一个给定的字符。该函数的使用格式是:,putchar,(,输出的字符,),;,2.4,简单的输入输出,2.4.1,字符型数据的输入输出函数,例,2.1,putchar,(),函数的使用举例,#include,void main(),/*,定义,char,型变量,a,b,c,*/,char,a,b,c,;,/*,给,a,b,c,变量赋上初始数据*,/,a=D;b=o;c=g,;,/*,调用,putchar,(),函数,逐个输出,a,b,c,*/,putchar,(a);,putchar,(b);,putchar,(c);,运行结果是:,Dog,2.4,简单的输入输出,2.4.1,字符型数据的输入输出函数,若将例,2.1,程序中的:,putchar,(a);,putchar,(b);,putchar,(c);,改成:,putchar,(a);,putchar,(n);,putchar,(b);,putchar,(n);,putchar,(c);,运行结果如何,?,思考,:,2.4,简单的输入输出,2.4.1,字符型数据的输入输出函数,2,字符输入函数,getchar,(),getchar,(),函数的作用是暂停程序的运行,等待用户从标准输入设备(指键盘)上输入一个字符。该函数的使用格式是,getchar,(),;,2.4,简单的输入输出,2.4.1,字符型数据的输入输出函数,例,2.2,从键盘上输入两个数字字符,将它们分别转变成数值数后,输出这两个数之和。,#include,void main(),char ch1,ch2;,int,x1,x2,sum;,ch1=getchar();,ch2=getchar();,x1=ch1-0;,/*,将数字字符,ch1,转变成数值数*,/,x2=ch2-0;sum=x1+x2;,printf,(x1=%d,x2=%d,sum=%d,x1,x2,sum);,2.4,简单的输入输出,2.4.1,字符型数据的输入输出函数,1.3,和,3,有什么不同?,ch1-0,表达式的功能是什么,?,getchar,(),可以连续地读入几个字符吗,?,思考,:,2.4,简单的输入输出,2.4.2,简单的格式化输入输出函数,1,格式化输出函数,printf,(),printf,(),是格式化输出函数,可以用于输出各种数据类型的数据,且一次可以实现多个数据输出。,printf,(),的使用格式如下:,printf,(“,输出格式控制参数”,输出项表,);,2.4,简单的输入输出,2.4.2,简单的格式化输入输出函数,printf,(“,输出格式控制参数”,输出项表,);,说明:,输出格式控制参数:,输出格式控制参数是用双引号括起来的字符序列,其中可能出现三类字符:,普通的显示字符,:,原样输出;,转义字符,:,按照其控制含义控制输出;,格式控制符,:,见表,2-5,常用格式控制符。,2.4,简单的输入输出,2.4.2,简单的格式化输入输出函数,printf,(“,输出格式控制参数”,输出项表,);,表,2-5,常用格式控制符,代码,含义,%d,以十进制格式输出,int,型整数,%ld,以十进制格式输出,long,型整数,%c,输出一个字符,%s,输出一个字符串,%f,以小数形式输出一个,float,型浮点数,%lf,以小数形式输出一个,double,型浮点数,2.4,简单的输入输出,2.4.2,简单的格式化输入输出函数,printf,(“,输出格式控制参数”,输出项表,);,输出项表:,可以是用逗号分隔的多个输出表达式,在前面的输出格式控制参数中有多少个格式控制符,就应该有多少个输出项,格式控制符和输出项是从左到右匹配,一一对应的。,2.4,简单的输入输出,2.4.2,简单的格式化输入输出函数,printf,(“,输出格式控制参数”,输出项表,);,格式控制符起到一个占位符的作用。,在输出时,后面对应输出项的值就出现在格式控制符所在的位置。在“,%”,和格式控制符之间还可以有限定输出项宽度的数值。,例如,,%5d,、,%8.3f,。,2.4,简单的输入输出,2.4.2,简单的格式化输入输出函数,例,2.3,将,19,的数字分三行显示,每个输出项占,4,个字符,的宽度,并求出每行之和,显示之前加上必要的提示。,#include,void main(),printf,(%4d%4d%4dn,1,2,3);,printf,(%4d%4d%4dn,4,5,6);,printf,(%4d%4d%4dn,7,8,9);,printf,(the total of first line is%d.n,1+2+3);,printf,(the total of second line is%d.n,4+5+6);,printf,(the total of third line is%d.n,7+8+9);,2.4,简单的输入输出,2.4.2,简单的格式化输入输出函数,2,格式化输入函数,scanf,(),scanf,(),是格式化输入函数,可以用于输入各种数据类型的数据,且调用一次可实现多个数据的输入。,scanf,(),的使用格式如下:,scanf,(“,控制字符串”,输入项地址表列,);,2.4,简单的输入输出,2.4.2,简单的格式化输入输出函数,说明:,控制字符串:,控制字符串是用双引号括起来的字符序列。,一般只出现格式控制码,不包含转义字符,,普通字符,:,要求原样的输入。,常用的格式控制码,:,如表,2-6,所示。,scanf,(“,控制字符串”,输入项地址表列,);,2.4,简单的输入输出,2.4.2,简单的格式化输入输出函数,scanf,(“,控制字符串”,输入项地址表列,);,表,2-6,常用格式控制码,代码,含义,%d,用来输入十进制,int,型整数,%ld,用来输入十进制,long,型整数,%c,用来输入一个字符,%s,用来输入字符串,%f,用来输入,float,型浮点数,%lf,用来输入,double,型浮点,2.4,简单的输入输出,2.4.2,简单的格式化输入输出函数,输入项地址表列:,输入项一般是变量的地址,其格式一般是:,&,变量名,scanf,(“,控制字符串”,输入项地址表列,);,可以是用逗号分隔的多个输入项。在前面的控制字符串中有多少个格式控制码,就应该有多少个输入项地址。,2.4,简单的输入输出,2.4.2,简单的格式化输入输出函数,例,2.4,scanf,(),函数使用举例。,#include,void main(),int,a,b,;,printf,(Enter integer a and b:);,scanf,(,%d%d,&a,&b,);,printf(a+b=%dn,a+b);,printf(a-b=%dn,a-b);,上机认真体会该程序的运行!,2.5,算术运算符和算术表达式,算术运算符是,C,语言中运用广泛的一种运算符,可以实现加、减、乘、除之类的运算。,C,语言还提供了一种称为自增、自减的运算符。要求有两个操作数的运算符,称为二元运算符;而一元运算符只要求一个操作数。,2.5,算术运算符和算术表达式,2.5.1,基本算术运算,2.5.2,自增自减运算,2.5.3,算术运算符的优先级和结合性,2.5,算术运算符和算术表达式,2.5.1,基本算术运算,表,2-7,基本的算术运算符,运算符,含义,例子,-,一元负号运算符,-5,+,一元正号运算符,+5,*,乘法运算符,3*5,,结果是,15,/,除法运算符,3/5,结果是,0,;,3.0/5,得,0.6,%,取余运算符,10%3,结果是,1,;,3%5,得,3,+,加法运算符,-,减法运算符,2.5,算术运算符和算术表达式,2.5.1,基本算术运算,例,2.5,求表达式,5x,3,+3x,2,+1.5x+12.5,的值。,x,的值从键盘输入。,解:,从键盘输入,x,的值,计算表达式的值,存于,y,中,输出,y,2.5,算术运算符和算术表达式,2.5.1,基本算术运算,解:,#include,void main(),float x,y;,printf,(“Input x:”);,scanf,(“,%f”,&x,);y=5*x*x*x+3*x*x+1.5*x+12.5;,printf,(“,y=%fn”,y,);,2.5,算术运算符和算术表达式,2.5.2,自增自减运算,1,自增自减运算,2.5,算术运算符和算术表达式,2.5.2,自增自减运算,例,2.6,自增运算和自减运算举例,#include,void main(),int,a=25,b=80,aa,bb;,a+;b-;,aa=+a;bb=-b;,printf(“a=%d,b=%d,aa=%d,bb=%dn”,a,b,aa,bb);,aa=a+;bb=b-;,printf(“a=%d,b=%d,aa=%d,bb=%dn”,a,b,aa,bb);,2.5,算术运算符和算术表达式,2.5.3,算术运算符的优先级和结合性,在算术运算中,乘、除、求余优于加、减,它们是从左到右结合的。自增自减是一元运算符,,C,语言规定,一元运算符的优先级高于二元运算符,且结合方向是从右到左。当然,括号可以强制改变运算的优先顺序和结合顺序。,2.6,赋值运算和赋值表达式,变量是存储空间的抽象,将一个数据放置于变量所在的存储空间,可以通过赋值语句来实现。,C,语言中有简单赋值运算符和复合赋值运算符之分。,2.6,赋值运算和赋值表达式,2.6.1,简单赋值运算,2.6.2,复合赋值运算,2.6.3,赋值表达式的类型,2.6,赋值运算和赋值表达式,2.6.1,简单赋值运算,变量,=,表达式,赋值运算符是二元运算符,,C,语言赋值表达式的格式为:,赋值运算符的功能是计算赋值号右边的表达式的值,并将该值存储在变量所在的存储空间。,例如,:,a=c+,;,b=x*y+5;,2.6,赋值运算和赋值表达式,2.6.1,简单赋值运算,注意,:,左边的运算对象一定是存储空间的抽象,是变量,不能是常量或用别的运算符联接的一个表达式,右边表达式值的数据类型和左边变量的数据类型不一致时,以左边的数据类型为主,赋值运算符可以连在一起用,构成更复杂的赋值运算表达式,2.6,赋值运算和赋值表达式,2.6.2,复合赋值运算,C,语言中常用的算术复合赋值运算符如表,2-8,所示。,表,2-8,算术复合赋值运算符,运算符,运算名称,例,等价于,+=,加赋值,a+=b,a=a+b,-=,减赋值,a-=b,a=a,-b,*,=,乘赋值,a*=b,a=a*b,/=,除赋值,a/=b,a=a,/b,%=,取余赋值,a%=b,a=a%b,2.6,赋值运算和赋值表达式,2.6.2,复合赋值运算,复合赋值运算表达式的构成格式和前面介绍的简单赋值运算符类似,其使用形式是:,2.6,赋值运算和赋值表达式,2.6.3,赋值表达式的类型,赋值运算符的功能是计算赋值号右边表达式的值,并将该值存储在变量所在的存储空间。当赋值运算符两边的数据类型不一致时,,以左边的变量的数据类型为主,,即,C,编译系统自动将赋值运算符右边的表达式类型转换成与左边的赋值目标相同的类型后再赋值。其转换规则如表,2-9,所示。,2.6,赋值运算和赋值表达式,2.6.3,赋值表达式的类型,表,2-9,赋值中的常见类型转换,左值类型,值类型,结果,int,char,将数据放入低,8,位,高,8,位补,0,或进行符号扩展,char,int,int,型的高,8,位截去,char,int,long,int,将高位截去,int,float,double,将小数部分截去,float,double,将,double,型超出的小数部分四舍五入,double,float,将,float,型的指数部分和尾数部分分别存入,double,2.6,赋值运算和赋值表达式,2.6.3,赋值表达式的类型,例,2.7,复合赋值运算举例。,#include,void main(),int,a=12,b;,a+=a-=a*=a,;,printf,(,a=%d,a,);,a=12;b=2;a*=a+b;,printf(na=%d,a);,a=12;b=7;,a%=(b%=5);,printf(na=%d,b=%d,a,b);,2.7,逗号运算和逗号表达式,逗号运算符用于把几个表达式连接起来构成一个新的表达式,称之为逗号表达式。逗号表达式的一般形式为:,表达式,1,,表达式,2,,,,表达式,n,逗号表达式的计算顺序是:从左到右依次计算各表达,式,并把最右边表达式的值作为整个逗号表达式的值。,2.7,逗号运算和逗号表达式,例,1,:,x=y=3,y+1;/*,等价于,(x=(y=3),(y+1)*/,例,2,:,x=(y=3,y+1);/*,等价于,(x=(y=3),(y+1)*/,2.7,逗号运算和逗号表达式,例,2.8,逗号运算举例。,#include,void main(),int,a,b,;,/*,赋值号右边是逗号表达式,*,/,b=(a=3+10,a*4),a+=-6);,printf,(,a=%d,b=%d,a,b,);,2.8,不同类型数据之间的混合运算,在,C,语言的表达式中,不同类型数据之间可以进行运算,但须按一定的规则转换成相同的数据类型后才能进行。有三类转换:,赋值表达式的类型转换,算术表达式的类型转换,强制类型转换,2.8,不同类型数据之间的混合运算,2.8.1,算术表达式的类型转换,2.8.2,强制类型转换,2.8,不同类型数据之间的混合运算,2.8.1,算术表达式的类型转换,当表达式中存在不同类型的常量和变量时,这些常量和变量应转换成相同类型,才能进行运算。类型转换规则有如下几点:,同类型数据之间进行算术运算时,其结果仍为同类型的数据。,不同类型的数据在一起运算时,,C,编译器自动将所有操作数“向上”转换成数据最长的操作数类型。,char short unsigned short long,unsigned long float double,long,double,2.8,不同类型数据之间的混合运算,2.8.1,算术表达式的类型转换,运算结果存入变量时,自动向变量的数据类型看齐,可以使用强制转换运算符改变参与运算的数据类型,或者运算结果的数据类型,2.8,不同类型数据之间的混合运算,2.8.1,算术表达式的类型转换,例如:,char,ch;int,i;long,l;float,f;double,d;,result=(,ch,+i)/(f-d)*(i /f),2.8,不同类型数据之间的混合运算,2.8.2,强制类型转换,C,语言提供了一种强制类型转换,由程序员来决定是否进行数据类型的转换。强制类型说明的一般形式如下:,(数据类型名)表达式,例如,,float x=7.5;,(,int,)x%5,2.9,运算符的优先级和结合性,优先级,运算符,名称,结合性,最低,1,(),-.,强制运算符,从左到右,2,!-+-*&,sizeof,单目运算符,从右到左,3,*,/%,算术运算符,从左到右,4,+-,5,位移运算符,从左到右,6,=,关系运算符,从左到右,从左到右,7,!=,8,&,位逻辑运算符,从左到右,9,10,|,11,&,逻辑运算符,从左到右,12,|,13,?:,条件运算符,从右到左,14,=+=-=,*=,/=%=,&=,=!=,赋值运算符,从右到左,15,逗号运算符,从左到右,谢谢学习,第,2,章,
展开阅读全文