第2章基本数据类型及其运算程序由算法和数据构成。数据是算法的处理对象。要学习程序设计,首先要了解处理对象—数据的特点。本章中我们讨论C语言中基本数据及其类型和基本的运算方法。2.1基本数据类型通过对上一章的学习,我们知道不同的数据在计算机中的表示方法是不同的(如:定点数、浮点数、字符数据等不同类型),这是由计算机的二进制存储特性所决定的。在程序中要指定数据的类型,以便编译系统能够按指定类型确定其表示方法、字节个数、以及运算方式。在上述类型中,虚线框中的类型又称为导出类型,定义这类数据时要用到基本类型。在C语言的程序中,对于所用到的数据必须事先进行定义即先定义,后使用。表2-1中,给出了TurboC的基本类型名和长度以及取值范围。需要指出的是:(1)在TurboC中:char与signedchar型数据在长度、取值范围都一致,故两者是等价的。与此情况相同的还有:short与signedshort型、int与signedint型、long与signedlong型。(2)在TurboC中int与short型数据在长度、取值范围是一致的。(3)需要指出的是一般:char型与signedchar型或unsignedchar型二者之一相同。int型与short型或long型二者之一相同。具体如何,视不同编译系统而定。(4)在C语言中,字符型数据存放的是字符的ASCII码值。有符字符型数据用一个字节的最高位作为符号位,低七位表示字符的ASCII码值。无符字符型用一字节的全部八位表示字符的ASCII码值。利用这个存储特点,C语言允许字符型数据以其ASCII码值(整型数)参加数值运算。(5)在TurboC中,float型数据的存储格式为:阶码占8位,尾数占23位,一位符号位;double型数据的存储格式为:阶码占11位,尾数占52位,一位符号位。从表中可以看出:C语言中基本数据类型很多,短的、长的、有符的、无符的,变化丰富。初学者可能感到比较困难,其实从数据的存储形式上来看,归纳起来实质上只有两大类型的数据—整型数据和实型数据,即定点整数和浮点数。2.2常量与变量2.2.1常量所谓“常量”是指在程序运行过程中,其值不能被改变的量。C语言中常量有整型常量、实型常量、字符型常量、字符串常量、符号常量和枚举常量。本节将介绍上述除枚举常量外的所有常量,枚举常量在第九章中介绍。1.整型常量整型常量又简称整数,它又三种形式:十进制整数、八进制整数、十六进制整数。十进制整数十进制整数由0~9十个数字、正号、负号组成,正负号只能出现在最左边,表示一个整数时,正号可以省略,多位数时,最左边的数字不能为0。例如:123597―4250―0是合法的整数。而0932是非法的整数表示方法。八进制整数八进制整数必须以0(零)开头并由0~7八个数字、正号、负号组成,正负号只能出现在最左边。例如:01230404―0453―00是合法的八进制整数,而0128是非法的。十六进制整数十六进制整数必须以0x(0X)开头,由0~9,a,b,c,d,e,f(或A,B,C,D,E,F)这十六个符号和正负号组成,正负号只能出现在最左边。例如:0x1230Xfa1―0x9a12―0x0是合法的十六进制数。0x12g―x897a25b是非法的十六进制数。整型常量的后缀U和LU和L分别是unsigned和long的第一个字母,可以跟在整型常量的后面,以指明该整数为长整型常数(long型)、无符整型常数(unsigned型)以及无符长整型整数(unsignedlong型)。使用时U和L可以小写。例如:长整型数:32768l―0761L0xd1dL无符整型数:32768u―0x2a7U0277U无符长整型数:555ul0xabcLU0722ul当一个整型常数的值是在―32768~32767之间,则该整型常量为int型,当它的值超过―32768~32767而在―21亿~21亿之间时,则该整型常量为long型。通过使用L和U后缀,可以使在―32768~32767之间的int型常量成为long型常量或使有符常量成为无符常量。2.实型常量实型常量又称浮点型常量,它有两种表示方法:十进制小数形式和指数形式。十进制小数形式十进制小数由0~9十个数字、小数点、正号、负号组成,正负号只能出现在最左边。例如:123.5―032.45―.00.是合法的实型常量。指数形式指数的一般形式如下:[±][整数部分][.小数部分][e±n]其中[]中内容为可选,但“整数部分”和“小数部分”二者至少选其一,不可全无。[e±n]为指数部分,e可大写,n是一个1~3位的十进制整数(第一位可为0),2e2表示2102,。例如:123.5E3―0.45e―41E0120e5是合法的指数形式。-E5-1E2.05.e50.8Ek是非法的指数形式。实型常量的后缀F和L因为实型常量缺省的类型为双精度实型,为了达到存储、精度、类型转换的需要,可用后缀F和L。F和L分别是float和longdouble的第一个字母,可以跟在实型常量的后面,以指明该实数为单精度实数(float型)或长双精度实数(longdouble型)。使用时F和L可以小写。例如:单精度实数:32.768f―1F1.2e3F长双精度实数:1.2e309l―0.1L5L3.字符型常量字符常量是用一对单引号括起来的一个字符,如:'a','A','$',等。空字符也是字符,它包含0个字符,它的值是0,可以表示为'',也可以表示为'\0',程序中总是用'\0'表示空字符。在C语言中还有另外一种字符常量,称为转义字符,它是以反斜线(\)开头的字符串,通常也把它们称为控制字符,因为它们中的大多数具有控制功能,如'\n'代表换行符,在printf函数中使用它可以实现换行的功能。C语言中的转义字符见表2-2。在C语言中,字符常量是一个整数,其值是它所对应的ASCII码的值(见附录Ⅰ),字符型数据可以与数值型数据通用,即可以进行算术运算。如:'a'的值是97,'A'的值是65,'\'的值是39等。也可以用\ddd或\xhh来表示一个字符。以下都是表示水平制表符:'\t''\011''\11''\x09''\x9'而'a'也可以写成以下形式:'\141''\x61'例2.1转义字符含义十进制八进制十六进制\0空字符000x00\a响铃770x07\b退格,从当前位置向前移动一格8100x08\f换页,从当前位置换到下一页开头120140x0c\n换行,从当前位置换到下一行开头100120x0a\r回车,从当前位置换到本行的开头130150x0d\t水平制表,水平换到下一tab位置90110x09\\反斜线字符\921340x5c\ˊ单引号字符ˊ390470x27\〞双引号字符〞340420x22\ddd1到3位八进制数对应的字符0~255000~3770x00~0xff\xhh1到2十六进制数对应的字符0~255000~3770x00~0xff表2-2main(){printf(''Hello,C\n'');printf(''\110\145\154\154\157\54\103\12'');printf(''\''12/4=3\''\t\\isastring\\\n'');}运行结果:Hello,CHello,C''12/4=3''\isastring\4.字符串常量字符串常量是由双引号括起来的一串字符。如:''1234''、''中国,北京''等。值得注意的是:字符是用单引号括起来的,而字符串是用双引号括起来的。'a'是字符,而''a''是字符串。字符串可以为空串即包含0个字符的串,表示为''''。C语言规定:在每一个字符串后,系统自动加一个'\0',作为字符串的结束标志符,以便判字符串的长度。由于这个原因,字符串的长度比实际长度大1。空串的长度为1,而不是0。在使用字符串时,应当注意以下情况:(1)单引号作为字符串的组成字符时,可以直接使用。例如:printf(''It'smybook\n'');执行后输出为:It'smybook(2)一个字符串不能分写在两行或多行上,如果非要写在两行上,则可在前一行的字符串尾部加一个反斜线\或者把不同行上的字符串分别用双引号括起来。例如:printf(''Cprogramming\languageispowerful\n'');或者:printf(''Cprogramming''''languageispowerful\n'');5.符号常量符号常量是代表一个字符序列的标识符(又称宏名)。一旦定义了一个符号常量,则它就与该字符序列是等价的。在C语言中,定义符号常量的方法有三种:一是使用编译预处理的宏替换功能#define;二是使用类型限定符const说明并初始化。三是使用枚举类型来定义。在此只介绍#define定义一个符号常量,格式如下:#define标识符字符序列#define标识符字符序列其中:字符序列可以由任意字符组成,还可以是已经定义过的符号常量。符号常量应先定义后使用,可以出现在程序中的任何位置,习惯上尽量放在程序的前面且符号常量(宏名)用大写字母书写,以示与其它标识符的区别。需要指出的是:当一个标识符被定义成符号常量,则在编译时,编译预处理首先将程序中所有该标识符用相应的字符序列来替换,然后再进行后续处理。例如:#definePI3.14159#defineSPACE‘’等。例2.2#defineSTR1''Thisisa''main(){#defineSTR2''joke''#defineMSTR1STR2printf(M);/*或者printf(STR1STR2);*/}运行结果:Thisisajoke另外,需要时还可使用#undef来取消已经定义了的符号常量。例如:#undefM取消定义后,该符号常量(宏名)还可再定义并使用。2.2.2变量所谓“变量”是指在程序运行过程中,其值可以被改变的量。变量用变量名来表示,当程序运行时,系统为每一个变量分配一个内存单元并在变量名和该内存单元地址间建立一一对应的关系,引用该变量名时,实际上就是引用该变量名所对应地址单元的内容。如图2-2所示:数据是有不同类型的,它们的长度、表示方法也各不相同,因此变量也应有不同的类型,用以存放各种类型的数据。常量的类型是通过书写形式确定的即是隐含说明的。变量的类型则需要预先定义。在程序执行时,系统为已经定义的不同类型的变量分配单元,如为一个int型变量分配一个两字节的存储单元,为一个float型变量分配一个四字节的存储单元等,并确定了数据在其中的存储形式。变量定义的格式如下:类型定义符变量名表;例如:intstudent_num;/*numberofstudent*/floatstudent_score,aver;/*scoreandaveragescore*/其中,类型定义符(见表2-1)定义变量名表中所列变量的类型,变量名表由一个或多个变量名组成,其间用逗号“,”分隔,变量名的命名应符合C语言标识符的规定。定义变量时,还可以在定义的同时对变量进行初始化(赋初值),其格式如下:类型定义符变量名=表达式,····;例如:longdistance=700000,height;doublearea=9.6e7;floats=3*distance;其中,变量名=表达式中的“=”称为赋值号,其含义是将“=”右边表达式的值赋给其左边的变量。在定义变量时,应注意以下几点:(1)在使用变量时,应注意“先定义,后使用”的原则。C语言程序中,使用的任何变量必须在使用前已经定义过,否则,就会出现错误。(2)一般在一个函数中,变量名不能重复定义,如果重复定义,则编译会给出错误信息。(3)除非有特定的需要,通常把定义变量的语句集中放在函数的开始处,在C语言程序中,将变量定义语句放在不同的位置,其含义有所不同,随意放置可能引起不必要的错误。建议:初学者加强对不同类型数据之表示方法以及存储方式的理解。如:inta;语句定义了一个什么类型的变量,变量名是什?该变量所对应