1《C语言程序设计》教学辅导(二)---第2章数据类型和表达式主要内容:一、数据类型二、常量三、变量四、运算符五、表达式六、一些系统函数的使用一、数据类型1.C语言程序中使用的每个数据都要归属于一种数据类型如使用的人的年龄:int;姓名:字符串;体重:带小数的实数(单、双)。2.数据类型有简单和复杂之分如描述人的单个属性的数据就是简单数据,属于简单数据类型,描述一个人的完整信息就需要把若个个简单数据组合起来,构成复杂(组合)数据,描述这种数据的类型属于复杂(组合)数据类型。3.数据类型有系统定义和用户定义之分一般来说,简单类型有由系统定义好的,组合类型需要用户根据实际情况进行具体定义。例如整数型(int)、字符型(char)、实数型(float,double)等都是C语言系统已经定义的,用户可以直接使用;职工记录类型需要用户自己定义。4.系统定义的数据类型分类C语言数据类型:广义整数型、实数型、引申型、组合型、空类型广义整数型:一般整数型、字符型、枚举型一般整数型:标准整数型、短整数型、长整数型标准整数型(int):每个数据占有4个字节的存储单元,即二进制的32位,可表示-231~+231-1之间的带符号的十进制整数,或者表示0~+232-1之间(0-4294967295)的无符号(正)的十进制正数。短整数型和长整数型可进行类似分析。字符型(char):每个ASCII码字符数据占有1个字节,即二进制的8位,可表示ASCII代码表中的一个字符,每个字符对应的整数值在0~+127之间。字符型还可以作为一个字节的整数看待,当规定为带符号字符型时,则表示-128~+127之间的整数,当规定为无符号字符型时,则表示0~255之间的整数。枚举型(enum):是用户自定义的一种简单的数据类型,该类型中的每个值需要在定义时具体罗列出来。例如:对三种颜色所定义的枚举类型:enumcolor{red,yellow,blue};其中color为该类型的标识符,后面花括号内的3个标识符red、yellow和blue为枚举值常量,分别对应红色、黄色和蓝色,对应的整数值分别为0、1和2。利用color类型标识符就可以定义一个变量,如“enumcolorx=blue;”语2句就定义了x为color枚举类型的一个变量,并把一个枚举值blue赋给x,使x的值等于2。实数类型:又分为单精度实数型(float)和双精度实数型(double)两种。单精度实数型(float):占用4个字节(即32位),其中用大约3个字节表示一个浮点数(定点数是一种特定表示)的尾数,用大约一个字节表示指数。如对于-0.18359×105,则用3个字节存储尾数-0.18359,用一个字节存储指数5。双精度实数型(double):占用8个字节(即64位),其中用大约7个字节表示一个浮点数的尾数,用大约一个字节表示指数。如对于-0.18359×105,则用7个字节存储尾数-0.18359,用一个字节存储指数5。两种实数类型的区别:由于双精度型数据占用的存储空间大于单精度型数据,所以双精度型能够表示更多的数字位数,通常单精度型只能表示7位有效数字,而双精度型能够表示16位有效数字。如3.23456×71.2345的结果为12位有效数字,则必须用双精度型变量来存储。空类型(void):即无类型,通常用来定义函数的返回类型。当一个函数不需要返回任何值时,就把该函数定义为void类型。空类型也作为指针所指向的一种类型,待第5章介绍。引申类型和组合类型:引申类型包括数组类型和指针类型,组合类型有结构类型(struct)和联合类型(union),在以后的相关章节中介绍。一种数据类型对应一个类型标识符:若是系统定义的数据类型,则类型标识符就是一个保留字,若是用户定义的数据类型,则是用户对该数据类型所起的名字。字符(char)、标准整型(int)、无符号标准整型(unsignedint)、单精度实数型(float)、双精度实数型(double)、空类型(void)等。使用一种数据类型就是使用它的类型标识符。二、常量C语言中的运算对象包括常量、变量、函数、表达式四种类别,而函数和表达式也是对常量和变量进行运算而得到的,所以说,最基本的运算对象是常量和变量。1.常量的表现形式常量又分为字面常量和标识符(符号)常量两种表现形式。字面常量的值就是字面本身,如25是一个字面整数常量,它的值就是25;标识符常量的值与字面本身不同,定义时需要为它赋值。如在C语言系统内定义有标识符常量NULL,它的值为0。2.字面常量字面常量又分为整数常量、实数常量和字符常量三种。整数常量:有3种进制表示:十、八、十六进制十进制:第一个数字非0的正整数或负整数。如1、25、-100、3270八进制:第一个字符为0、第二个及以后为八进制数字0-7的整数。如023、074等,它们对应的十进制数分别为19和60。八进制数不带符号位,隐含为正数。十六进制:前两个字符为0x或0X,后为0-9,a~f或A~F的整数,其中a~f或A~F依次表示十进制数10~15,如0x23、0Xa5等,它们对应的十进制整数分3别为35和165。十六进制数不带符号位,隐含为正数。整数常量的类型:被系统认为是标准整型(int),若要后缀字母u则认为是无符号整型,若后缀字母l或L则认为是长整型。如25、25u、25L分别表示int、unsignedint、longint。实数常量:只有十进制表示,又分为定点和浮点两种表示。定点表示:带小数点不带指数的常数表示。如12.0、-3.56、0.06等。浮点表示:既带尾数又带指数的常数表示,指数的底数10用字母e表示。如2.45e3、-30E-4、4.2e12等,它门在数学中称为科学记数法,分别对应为2.45×103、-3.0×10-3和4.2×1012。规范化的浮点表示:若在尾数部分的小数点前只有一位不为0的数字,则为规范化的浮点表示。如3.05E-8、-6.3e4为规范的,而32.5e6为不规范的,若改写为3.25e7则变为规范的。实数常量的类型:实数又分为双精度型(double)和单精度型(float),默认为双精度型。若在其实数后面加上字符标记f或F则为单精度型。如2.54为双精度型,则2.54f则为单精度型。字符常量:字符常量就是用单引号括起来的字符。字符有一般字符和转义字符之分,如a、5、+等属于一般字符,而\n、\0、\\、\075等属于转义字符,因为它们是以反斜线开始的。转义字符通常用来表示无法用字面表示的控制字符或特殊字符,如\n表示换行符,对于的ASCII码为10,\0表示ASCII码为0的字符。3.标识符常量用户可以通过3种方式定义标识符(符号)常量:(1)使用#define预处理定义命令如:#definePI3.14159就把PI定义为标识符常量,该常量值为3.14159。#defineEND-100把END定义为标识符常量,其值为-100。(2)使用const常量定义语句如:constintM=10;//该语句定义M为一个标识符整型常量,其值为10。constdoublePI=3.14159;//该语句定义PI为一个标识符双精度型常量,//其值为3.14159。注意:使用const语句定义的标识符常量带有数据类型,比使用#define预处理命令要强,所以要尽量使用const语句定义常量,当然在有些地方只允许使用通过#define预处理命令定义的标识符常量,如数组的长度。(3)在枚举类型中定义的每个枚举值都是标识符常量如:枚举类型定义:enumcolor{red,yellow,blue};其中的枚举值red、yellow和blue都是枚举常量,又称标识符常量,其常量值分别为0、1和2。三、变量1.变量的概念在程序设计中,允许其值被改变的量叫做变量。如在一个程序中需要根据一个人的月收入来计算税金,每个人的月收入不同,因而其税金也不同,所以应4当把月收入和税金分别设置为变量,当给月收入变量输入一个新值时,通过计算把对应的纳税额保存到税金变量中。在C语言中需要用一个标识符来表示变量,该变量应通过变量定义语句来定义,通过输入或赋值语句设置或改变它的值。2.变量定义语句类型关键字变量名[=初值表达式],…;在使用变量之前必须先进行定义。如要用变量r表示圆的半径,用s表示圆的面积,它们都应该是实数变量,假定采用双精度型,则对应的变量定义语句为doubler,s;若需要把一个整数变量i赋初值为0,给另一个整数变量p赋初值为1,则使用的变量定义语句为inti=0,p=1;下面在看一些变量定义和赋值的例子。intx,y,z;//定义x,y和z为整型变量x=5;y=8;//给x和y分别赋值为5和8z=x+y;//把x+y的值即13赋给整型变量zy=x+10;//把x+10的值15重新赋给y,当前y的值为153.在一个模块或复合语句内,变量定义语句在前访问该变量在后在程序中的一个摸块或复合语句内,所有变量定义语句必须在前面,后面是使用它们的表达式或语句,两者不能交叉。4.标识符常量定义语句const类型关键字常量标识符=初值表达式,…;实际上是在变量定义语句的前面加上const保留字,并必须给每个常量赋初值。如:constintM1=10,M2=50;就定义了M1和M2这两个常量,其值分别为10和50。5.使用变量和常量的程序举例#includestdio.h#defineM-1//符号常量中的字母通常采用大写constintN=10;//把整型标识符常量N定义为10voidmain(){intx,y;printf(请输入一个整数:);//字符串中不含格式符,原样输出scanf(%d,&x);//从键盘输入一个整数到xif(xN)y=M*x+1;//若xN,计算y的公式M×x+1elsey=(x+M)*x-3;//若x=N,计算y为(x+M)×x-3printf(x=%d,y=%d\n,x,y);//串中含有原样输出和格式信息}程序运行后若从键盘上输入数值5,则得到的输出结果为:x=5,y=-45若从键盘上输入的数值为20,则得到的输出结果为:x=20,y=377四、运算符1.运算符的概念就是对数据进行运算的符号。如要把两个数值数据加起来,就有加法运算符。这和数学上的运算符概念是相通的,但表示符号有的相同有的不同。2.运算对象运算对象就是参与运算的数据。例如3+5,3和5为运算对象,加号(+)为运算符。根据运算符所要求的运算对象的个数的不同,可以把运算符分类为单目、双目和三目运算符3种。一个运算对象叫单目,…。如-5、x+6、a=(xy?x:y)。3.根据运算对象的类型分类算术运算符:+、-、*、/、%比较运算符:、=、==、、=、!=逻辑运算符:&&、||、!赋值运算符:=、+=、-=地址运算符:&、*等等。4.运算符的优先级当一个算式中出现多个运算符时,谁先谁后,按什么次序进行,这就是运算符的优先级问题。运算符优先级高的先被计算,低的后被计算。C语言中的所有运算符,被划分为15个优先级,在教材第2章的表2-3中已明确列出,优先级编号越小表示优先级越高。如*、/运算符的优先级为3,而+、-运算符的优先级为4,所以加减运算的优先级低于乘除运算的优先级。5.运算符的结合性当同一优先级的运算符在一个算式中相邻出现时,是先算左还是先算右,这是由结合性所决定的。结合性分为从左向右和从右向左两种次序。如加、减法运算符是从左向右结合,赋值运算符是从右向左结合。如a+b-c、x+=y=6。6.常用运算符使用介绍双目算术运算符有+、-、*、/、%(取余)。如30/8=3,30%8=6,(double)30/8=3.75,-30/4=-7,-30%4=-2,4.5*2/10=0.9运算结果值的类型:同类型的结果同类型,不同取精度高者的类型。赋值运算符能够把一个值赋给一个变量或通过运算后赋给一个变量。6赋值运算符分为一般赋值运算符和复合赋值运算