数据类型是程序设计语言的重要概念,是高级语言区别于低级语言的显著特征。不同的数据类型在计算机内部的存储方式不同,允许的运算不同,适用的领域也不同。第2章基本数据类型、常量和变量C语言允许使用的数据类型有以下三类:(1)基本类型不可再分的最基本的数据类型,包括整型、浮点型,双精度型、字符型及无值类型等。基本类型通常代表单个数据。(2)构造类型由已知的基本类型通过一定的构造方法构造出来的类型,包括数组、结构体、联合体、枚举类型等。构造类型通常代表一批数据。(3)指针类型指针可以直接指向内存地址,访问效率高,用于构造各种形式的动态或递归数据结构,如链表、树等。1.基本数据类型及其关键字2.1基本数据类型表2-1基本数据类型及对应关键字表数据类型关键字字符型char整型int浮点(单精度)型float双精度型double无值类型void逻辑型_bool复数型_complex_imaginary不同类型的数据在计算机中的存储方式是不同的,即它们的存储结构和所占的存储空间字节数并不一样,这与宿主计算机的硬件特性有关。C语言为了提高程序的可移植性,没有对数据类型的长度和存储方式进行规定,而由不同类型的计算机上使用的不同的C编译系统自行确定。VC++6.0规定:①char型长度为1字节,按有符号二进制补码形式存储。②int型长度为4字节,按定点有符号二进制补码形式存储。③float型长度为4字节,以浮点形式存储,阶码占8位(增码表示),尾数占24位(归一化补码表示),6位有效数字精度,分辨率约为1.1×10-38。④double型长度为8字节,存储方式与float基本相同,阶码占11位,尾数占53位,15位有效数字精度,分辨率约为2.2×10-308。2.基本数据类型的存储方式和取值范围(1)short和long可以提供不同的数据长度以满足实际使用的需要。C规定:长度shortint≤int≤longintVC++6.016bit32bit32bitC规定:长度float≤double≤longdoubleVC++6.032bit64bit64bit(2)signed和unsigned规定了对数值符号的处理,只限于char型和int型。charsignedcharunsignedcharshortsignedshortunsignedshortintsignedintunsignedintlongsignedlongunsignedlong3.类型修饰符类型长度(字节)取值范围char1-128~127[signed]char1-128~127unsignedchar10~255int4-2147483648~2147483647[signed]int4-2147483648~2147483647unsigned[int]40~4294967295shortint2-32768~32767unsignedshort[int]20-65535longint4-2147483648~2147483647[signed]long[int]4-2147483648~2147483647unsignedlong[int]40~4294967295float4-3.4×1038~3.4×1038double8-1.7×10308~1.7×10308longdouble8-1.7×10308~1.7×10308VC++6.0数据类型和取值范围2.2常量及其类型常量是指在程序运行过程中,其值保持不变的量。常量分为char、int、double和字符串型。其类型是由书写形式决定的。1.整型常数在计算机中,整数是准确表示的。C语言可以识别十进制、八进制和十六进制的整数。(1)十进制整数十进制整数由正负号(+或-)后跟数字串组成,正号可以省略不写,且开头的数字不能为0。如1234,-23,+187,32767,5600,0在整数后面加上后缀u或U则构成无符号整数,如123u,5678U,70000u等。在整数后面加上后缀l或L则构成长整数,如-124783648l,1234567890L在整数后面加上后缀ul或UL则构成无符号长整数,如3456ul,1234567890ul(2)八进制整数以数字0打头,后跟0~7组成的数字串。例如:0123表示八进制常数123,相当于十进制数83。八进制整数可以加上后缀u(U),l(L)或ul(UL)分别构成八进制的无符号数、长整数或无符号长整数。例如:012345u、02765543102l、0345675026ul等。(3)十六进制整数以数字0和小写字母x(或大写字母X)打头,后跟0~9及A~F(或a~f)组成的数字字母串。其中,A~F(或a~f)分别表示十进制的10~15。例如:0x2f是一个十六进制,相当于十进制的47。若在十六进制数后面加上后缀u(U)、l(L)或ul(UL),则分别构成十六进制的无符号数、长整数或无符号长整数。如:0x89ad476bu,0x9043fecd2l,0x98bfd5ca7ul2.实数C语言中,实数是近似表示的,且只能用十进制表示。(1)定点格式,即由正负号、整数部分、十进制小数点和小数部分组成。整数部分和小数部分都是由0~9组成的数字串。例如,123.45,-256.701,.543,-25.,0.,.0,0.0等。(小数点必不可少)(2)指数格式,即在定点表示的基础上,后面再加上一个e或E后跟一个1~3位整数组成。如-1.234E18,2.74e-02,2.71828e0,.86e-3,1e-2等。书写指数格式的浮点数时,字母e或E前面必须有数字,可以没有小数点,如.2e3,2.3e,2e3是正确的,而.e3,e-3等是错误的。同时,e或E后面必须是正负整数,不能带小数点,如1.2e3.1、0.3e-0.5等是错误的。在计算机中,无论是定点表示还是浮点表示的实型常数都视为double型的。如果有必要,可以用后缀f(F)来表示float型实数,如2.6736F、12.56e-13f等。3.字符常量字符常量是用单引号括住的单个字符。(1)单引号表示法,用于可显示字符,直接用单引号(撇号)将该字符括住,即表示字符常数。如'A','a','5','$','?','+'等。(2)转义字符表示法,用于不可显示字符,主要是那些控制字符如换行符、回车符、换页符等,还有一些在C语言中有特殊含义和用途的字符如单引号、双引号、反斜杠,只能用转义序列表示。例如,‘\n’、‘\012’、‘\xa’均表示换行符,因为换行符的ASCII代码八进制值12,十六进制值是a。表2.3常用的转义字符转义字符含义十进制ASCII代码值说明\0NULL0ASCII代码值为0\aBELL7报警铃响\bBS8退格符(backspace)\fFF12换页符\nNL(LF)10换行符\rCR13回车符\tHT9水平制表符(Tab)\vVT11垂直制表符\\\92反斜杠\’’44单撇号(单引号)\””34双撇号(双引号)【例】字符常量的表示方法#includestdio.hvoidmain(){printf(%d\n,'B');//十进制printf(%c\n,'B');//字符printf(%c\n,66);printf(%c\n,'B'+32);printf(%d,%c,%d,%c\n,'\n','\0','\0','\x41');}4.字符串常量字符串常量是用双引号括起来的0个或多个字符的序列。例如Iamastudent.x//空字符串0107328136Isaid,\goodmorning!\//含转义字符(1)字符串常量的存储方式字符串常量存储时,按字符串中字符从左到右的顺序依次占用连续的存储单元,每个字符占1个字节,存放其对应的ASCII码。C编译系统还会自动在每个字符串常量的未尾追加一个零字符NULL('\0')作为字符串的结束标识。因此,一个含有n个字符的字符串常量要占用n+1个字节的存储空间。Iamastudent\04920616d20612073747564656e7400例如,字符串常量Iamastudent含有14个字符(包括3个空格字符),它将占用15个字节的存储单元。(2)字符串常量和字符常量的区别①从表示方式上看,字符串常量是以双引号定界,而字符常量则以单引号定界,如A是字符串常量,'A'则是字符常量。②每个字符常量只占1个字节的存储单元,而字符串常量则要占用一批连续的存储单元,其所占字节数为字符串长度加1。③字符型常量通常可存放在字符型变量中,而字符串常量则必须存放在字符型数组中。④字符型常量可以与整数混合运算,而字符串常量则不可以。2.3变量及其类型变量是指那些在程序运行过程中其值可以改变的量。变量代表着存储器中的一个存储单元。在C语言中,变量具有如下三个属性:①变量分为不同的数据类型,数据类型决定了该变量存储的数据的含义。②变量分为不同的存储类型,存储类型决定了变量在计算机中的存储位置及其寿命(生命期)。③变量在程序中的定义位置决定了该变量的作用域,即起作用的范围。1.变量的定义C语言规定,变量必须先定义后使用,变量的数据类型与变量名本身无关。变量定义一是定义变量的数据类型,二是定义变量的名称,三是说明变量的存储类型,其一般格式为:[存储类型]数据类型变量清单;charch1;staticinti,j,k;shortintsi;floatf1,f2;doublebalance,profit,loss;变量的数据类型可以是字符型、整型、浮点型、双精度型等。2.变量定义的位置变量定义的位置可以有三处:在函数体内定义的变量称为局部变量,在函数的形式参数表中定义的变量称为形参,在函数外部定义的变量称为全局变量。例如#includestdio.hintcolor;//全局变量intvalue(intx,floaty);//形式参数{intlower,upper,step;//局部变量charc,line;//局部变量floatdata,time;//局部变量unsignedlongi,j,k;//局部变量……}变量在程序中的定义位置,决定了该变量的作用域。(1)块级作用域块是用函数体内花括号括起来的一个程序段。在块内定义的变量具有块级作用域,其作用域从变量定义处到块的结束处(即块的右花括号处)。(2)函数级作用域函数作用域是指在函数体开头定义的变量,它们在其定义的函数内有效,即在整个函数内均可以引用。(3)文件级作用域在函数体外定义的变量具有文件级作用域。具有文件级作用域的变量可在整个文件中访问,即从变量定义的位置开始到该源程序文件结束。(4)程序级作用域程序级的作用域最大,在组成整个程序的所有文件中均有效。当用extern将全局变量说明为外部变量后,可以使其具有程序级作用域。【例】#includestdio.hinta;//全局变量voidmain(){intb,c;//函数级局部变量a=1;b=2;c=3;a=a+1;b=b+1;c=c+b;//a=2b=3c=6{intc;//块级局部变量c=b*3;//c=9a=a+c;//a=11printf(first:%d,%d,%d\n,a,b,c);//11,3,9}printf(second:%d,%d,%d\n,a,b,c);//11,3,6}*3.变量的存储类型变量的存储类型指的是变量在计算机内存中的存放位置。(1)局部变量的存储类型影响其生命期auto型变量的生命期只限于它所在的程序段执行期间;register型变量的生命期与auto相同,但存取速度快,个数有限;static型变量的生命期与整个程序执行期相同。(2)全局变量的存储类型影响其作用域static型变量的作用域仅限于它所在的程序文件;extern型变量的作用域可扩充到其他程序文件。在定义局部变量时,若省略存储类型说明符,则视为auto型。4.变量的初始化在定义变量的同时赋予其初值称为变量的初始化。如:inta=2,b=3;doublex,pi=3.1415926