第2章 数据类型.doc_第1页
第2章 数据类型.doc_第2页
第2章 数据类型.doc_第3页
第2章 数据类型.doc_第4页
第2章 数据类型.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章 数 据 类 型我们知道计算机处理的对象就是数据,然而不是所有的数据计算机都能直接处理。在计算机高级语言中能直接处理的数据类型称为该语言的数据类型。本章主要讨论C语言的数据类型。2.1 C数据类型概述什么是计算机的数据类型?这是我们首先要明确的一个问题。数据类型(data type)是一个值的集合和定义在这个集合上的一组操作的总称。例如C语言中的整数类型int,它的值的集合为区间minint,maxint上的整数(minint、maxint是依赖特定计算机的最小、最大整数);定义在其上的一组操作为:加、减、乘、整除和取模等。数据类型体现了数据结构的特点,一种高级语言提供的数据类型越丰富,其直接描述简单数据结构和组织复杂数据结构的能力就越强。C语言提供的数据类型较一般高级语言丰富,C语言除提供整型、字符型和实型等基本数据类型外,还提供了数组、结构体、共用体和指针等数据类型。利用这些数据类型能便捷地描述较复杂的数据结构(如常用的链表、二叉树、栈等动态存储分配的数据结构)。数据类型空类型指针类型基本类型整型字符型实型(即浮点型)枚举类型 构造类型数组类型结构体类型共用体类型C的数据类型如下:C语言中的数据有常量和变量之分,类似于数学中的常量和变量。2.2 常 量常量是指程序运行过程中其值不能被改变的数据对象。常量可以有不同的类型,如:78,0,-96为整型常量;76.6,-12.4为实型常量;a,A为字符型常量;a、C Language是字符串常量等。2.2.1 整型常量整型常量即整型常数。C语言整型常数可用三种表示方式:(1) 十进制整数。如124,234,-23,0等。(2) 八进制整数。以0开头的数是八进制数。如0234表示八进制数(234)8,它等于十进制数156。(3) 十六进制整数。以0x或0X开头的数是十六进制数。如0x234表示十六进制数(234)16,它等于十进制数564。例2.1 整型常量的表示。#include void main() int a, b, c;a=50; / a为十进制整数50b=-032; / b为八进制整数-32c=0x5b; / c为十六进制整数5bprintf(a=%d, b=%d, c=%dn, a, b, c); /以十进制整数形式输出a,b,c的值运行结果如下:a=50, b=-26, c=912.2.2 实型常量实数在C语言中又称浮点数。实数有两种表示形式:(1) 十进制数形式。它由数字和小数点组成(注意必须有小数点)。如0.678,.678,678.0,678.,0.0都是十进制数形式。(2) 指数形式。如54.0e3或54E3都代表54.0103。但注意字母e(或E)之前必须有数字,且e后面指数必须为整数,如e6,3.2e7.5,.e9,5e等都是不合法的指数形式。2.2.3 字符型常量1字符常量C语言的字符常量是用单引号(即撇号)括起来的一个字符。如a,A,#,?等都是字符常量。注意,a和A是不同的字符常量。C语言中有些控制字符(又称非显示字符)是无法直接用字符常量形式表示的。例如,前面已经遇到过的,在printf函数中的n,它代表一个“换行”符,就是一个难以用字符常量表示的控制字符。C语言规定用一种特殊形式表示控制字符,即以一个“”开头的字符序列。因为“”后面的字符已不再是原来该字符的作用而转为新的含义,因而称为转义字符。如n中的“n”不代表字母n,而作为“换行”符。C语言的转义字符如表2-1所示。表2-1 转义字符字符功 能字符功 能n换行a响铃t横向跳格(跳到下一个输出区)反斜杠字符v竖向跳格单引号字符b退格双引号字符r回车ddd1到3位8进制数所代表的字符f走纸换页xhh1到2位16进制数所代表的字符例2.2 转义字符的验证。#include void main() printf(ctderatYb=n); /为了反映空格的个数,用表示空格printf(376);第一个printf函数先在第一行左端开始输出“c”,然后遇到转义字符t,它的作用是跳格,即跳到下一个“输出区”,在我们所用系统中一个“输出区”占8列。“下一个输出区”从第9列开始,故在第911列上输出“de”。下面遇到转义字符r,它代表“回车” (不换行),当前输出位置移至本行行首(第1列),输出字符a,然后遇转义字符t再使当前输出位置移到第9列,输出字符Y,输出Y后当前输出位置是第10列。然后遇转义字符b,它的作用是“退格”,使当前输出位置回退到第9列,接着输出=。下面是转义字符n,它的作用是“回车换行”,当前输出位置移至下一行的行首。第二个printf函数是输出转义字符376,即字符。程序运行时,在打印机上得到如下结果(为了清晰地反映空格个数和对位关系,这里用表示空格,并全部使用全角字符):第9列¥在显示屏上看到的结果是:第9列这是由于转义字符r使当前输出位置回到本行行首,自此输出的字符(包括空格和转义字符t导致的跳格所经过的位置)将取代原来屏幕上显示的字符;转义字符b导致退格,使当前输出位置左移一列,该位置上原来屏幕上已显示字符也将被新输出的字符所取代。实际上,屏幕上完全按程序要求输出了全部的字符,只是因为在输出前面的字符后很快又输出后面的字符,在人们还未看清楚之前,新的已取代了旧的,所以误认为未输出应输出的字符。而在打印机输出时,不像显示屏那样会“抹掉”原字符,人们可以从打印机的运动过程观察到所有的输出过程和结果。如在第9列上输出字符Y后又输出字符=,两字符重叠打印成“¥”。2字符串常量字符串常量由一对双引号括起来的字符或转义字符序列构成。如welcome、a、$567.88、I am a student.n、nn等都是字符串常量。注意:a是字符常量,a是字符串常量,二者不同,不要混淆。2.2.4 符号常量符号常量是在程序(或程序的一部分)中指定用一个符号(标识符)代表一个常量。请看下面的例子:例2.3 符号常量的使用。#include #define PI 3.14159 /* 定义符号常量PI */void main() float radius, area;radius=2.0;area=PI*radius*radius;printf(Area=%fn, area);程序中用#define命令行定义标识符PI代表常量3.14159,此后凡在此文件中出现的PI都代表3.14159,可以和常量一样参与运算。程序运行结果为:Area=12.566360说明:(1) 我们用符号PI代替常量3.14159,使程序更易理解,可读性好。(2) 当需要修改PI的值时只需要改一处即可,方便又不易出错。(3) 定义符号常量要用#define命令,一般格式是:#define 符号常量标识符 常量这是一种“预编译命令”。有关#define命令的详细用法参见第12章。注意:符号常量不同于变量,它的值在其作用域(在本例为主函数)内不能改变,也不能再被赋值。如使用以下赋值语句给符号常量PI赋值是错误的。PI=3.1415; /* 错误的赋值语句 */习惯上,符号常量名用大写,变量名用小写,以示区别。2.3 变 量变量是指在程序运行过程中其值可以被改变的数据对象。实质上,变量是程序中的数据连同其存储空间的抽象。C语言规定变量必须先定义(也可称为声明)后使用。所谓定义变量就是通过C语句要求系统为该变量分配一个适当的存储单元,供存放数据使用。例如,C语句“int x;”就是向系统申请一个能存放int(基本整数)型数据的存储单元,如图2-1(a)所示。x x x (a) (b) (c)图2-1 变量的存储单元25128系统分配的这个单元只能存放int型的数据,且每一个时刻只能存放一个,x为这个单元的名字,我们称为变量名。变量定义好后,我们可以通过变量名对该单元进行存取数据。如C语句“x=25;”就是把25存入变量x中,其结果如图2-1(b)所示。如果再执行C语句“x=128;”将把128存入变量x中,其结果如图2-1(c)所示,此时变量x的值就改变为128,而不再是25。理解C语言的变量时应该注意以下几点:(1) 一个变量应该有一个名字,称为变量名,如变量名x。(2) 一个变量在内存中占据一定大小的存储单元,可以通过变量名对该存储单元存取变量的值,如128为变量x的值。(3) 变量是有类型的,不同类型的变量分配不同大小的存储空间,存放不同类型的数据。如C语句“int x;”定义的是一个int型变量,它所对应的存储单元是2个字节。(4) 所谓的变量应该包括变量名、存储单元、变量的值几部分内容。2.3.1 标识符的命名规则与其他高级语言一样,用来标识变量名、符号常量名、函数名、数组名、类型名、文件名等的有效字符序列称为标识符。简单地说,标识符就是一个名字。C语言是大小写敏感的,即大写和小写字母认为是不同的字母。例如变量名name和NAME表示不同的名字。C语言标识符的命名规则是:(1) 标识符只能由26个字母、数字和下横线“_”组成,且数字不能作为标识符的第一个字符。(2) C语言中标识符的长度(字符个数)无统一规定,随系统而定。在Turbo C中,一个标识符的前31个字符在程序中是有效的,也即是说,它们可以相互区别。(3) 标识符中间不能有空格。(4) C语言的关键字不能作为标识符。例如,price、velocity、a3、interest、m_iNumber等都是合法的变量名,而101、NO.1、S&T、#203、red flag、up-to-date等都是非法的变量名。在编程时,变量、函数等标识符的命名是一个极其重要的问题。好的命名方法使变量易于记忆且程序可读性大大提高。标识符的命名方式,决定了程序书写的风格。在整个程序中要保持统一风格,这很重要。一般地,标识符的选择通常是“常用取简,专用取繁”,尽量“见名知义”,以增加程序的可读性。例如,看到numberOfStuddents这个变量名就知道它表示学生数,即便写成numOfStudent也是一目了然。另一方面,X6y5其含义就不是很清楚了。习惯上,变量名用小写字母表示。如果名字需要由两个单词或两个以上的单词(如math和score)组成,常用的两种命名方式是math_score和mathScore。前一种形式称为连接命名法,它是通过下划线将多个单词连接起来;后一种形式称为骆驼表示法,因为大写字母看起来像驼峰。还有一种特别流行的方法是匈牙利标记法(Hungarian notation),该法在每个变量名字前面加上若干表示类型的字符,如,fMathScore表示实型变量(f代表float型)、fpMathScore表示实型指针变量(fp代表float型的指针)。这种命名方法是以两条规则为基础的:(1) 标识符的名字以一个或者多个小写字母开头,用这些字母来指定数据类型。表2-2中列出了常用的数据类型的前缀。表2-2 常用数据类型的前缀前缀常用数据类型前缀常用数据类型c字符(char)l长整型(long)sz表示以0结尾的字符串(string)f单精度实型(float)s短整数(short)df双精度实型(double)n或i整型(int)un无符号整型(unsigned)(2) 在标识符内,前缀以后就是一个或者多个第一字母大写的单词,这些单词清楚地指出了变量在源程序中的用途。例如,szStudentName表示学生姓名,数据类型是以0结尾的字符串。2.3.2 变量的定义与初始化C是强类型语言。强类型语言要求程序设计者在使用变量之前必须对变量进行定义(声明变量的数据类型)。程序设计过程中,绝大部分错误是发生在数据类型的误用上,使用强类型语言编程,编译程序能检查出尽可能多的数据类型方面的错误。1变量的定义可以在一条语句中定义多个同类型的变量,变量定义的一般形式为:类型标识符 变量列表;表2-3中列出了C语言的基本数据类型标识符。表2-3 C语言的基本数据类型标识符标识符基本数据类型int基本整型short int或short短整型long int或long长整型unsigned int或unsigned无符号整型unsigned short int或unsigned short无符号短整型unsigned long int或unsigned long无符号长整型char或signed char带符号字符型unsigned char无符号字符型float单精度实型(浮点型)double双精度实型long double长双精度实型void空类型(或称无类型)例如:unsigned unMyAge, unMyWage; / 定义2个unsigned int类型的变量int iLength, iWidth, iHigh; / 定义3个int类型的变量float fArea; / 定义1个float类型的变量char cSex, cType; / 定义2个char类型的变量说明:(1) 空类型(void类型)仅仅是具有数据类型的形式,不具备其他数据类型的属性,它一般是用来声明函数的类型,表示函数不需要返回值。(2) 字符串只有常量的概念,没有直接的变量概念。但是,可以通过字符数组和字符指针变量来实现字符串变量的作用(详见第6章和第8章)。2变量的初始化定义一个变量后,系统为所定义的变量按数据类型的要求分配一个一定大小的存储单元,这时该存储单元所存放的值(变量的值)一般是一个不确定的值(随机值)。此后,可以用赋值运算符“=”给变量赋值。例如:unsigned unMyAge; / 变量的定义int iLength, iWidth;unMyAge=18; / 变量赋值iLength=12;iWidth=10;也可以在定义变量的同时给变量赋值,称为变量的初始化。例如:unsigned unMyAge=18; / 变量的定义并初始化int iLength=12, iWidth=10;可见,一条变量初始化语句相当于前面介绍的变量定义、给变量赋值两条语句,它们的效果完全一样。系统都是先给变量分配一个存放整数的内存单元,然后将一个整数值赋给该变量(存储单元)。3变量或类型长度运算符sizeof( )C语言提供的运算符sizeof( )是用来求C语言的类型或变量所分配存储单元的长度(字节数)。例如,sizeof(int)或sizeof(iWidth)的值为2,sizeof(float)或sizeof(fArea)的值为4,说明int型的数据在计算机内存占2个字节,而float型的数据占4个字节。2.3.3 整型变量基本数据类型的变量包括整型变量、实型变量、字符型变量和枚举类型变量(在第11章中讨论)。整型变量可分为基本型、短整型、长整型三种,分别是:(1) 基本型,类型标识符为int;(2) 短整型,类型标识符为short int或short;(3) 长整型,类型标识符为long int或long。它们又区分为有符号(signed)和无符号(unsigned)两大类。对于有符号数,存储单元的最高位用来存储符号,0表示+,1表示-;对于无符号数,存储单元中全部二进制位(bit)用作存放数本身,而不包括符号。无符号型变量只能存放不带符号的整数,如23、507等,而不能存放负数,如-23、-98。如果整型量在内存中占2个字节(16位),则int型变量存放数的范围为-3276832767,而unsigned int型变量存放数的范围为065535。概括起来,整型变量有:整型变量长整型(long)基本整型(int)短整型(short)无符号型无符号整型(unsigned int)无符号短整型(unsigned short)无符号长整型(unsigned long)C标准没有具体规定以上各类数据所占内存字节数,各种机器处理上有所不同,一般以一个机器字(word)存放一个int型数据,而long型数据的字节数应不小于int型,short型不长于int型。以IBM PC为例,整型数的表示范围如表2-4所示。用户可根据数的范围来选用。表2-4 整型数据的表示范围类型标识符所占位数数的范围int16-3276832767 即 -215(215-1)short int16-3276832767 即 -215(215-1)long int32-21474836482147483647 即 -231(231-1)unsigned int16065535 即 0(216-1)unsigned short16065535 即 0(216-1)unsigned long3204294967295 即 0(232-1)例如:int a=-2;short int b=32765;long int c=-2;unsigned int d=65534;unsigned short e=32765;unsigned long f=0xABCDEF;整型数据初始化后,系统分配给相应变量的存储单元及整型数据的存储结构如图2-2所示。注意:变量a、b、c的最高位(即最左边一位)为符号位。图2-2 整数的存储abcdef1111111111111110int型(-2)0111111111111101short型(32765)long型(-2)111111111111111011111111111111111111111111111110unsigned int型(65534)0111111111111101unsigned short型(32765)unsigned long型(0xABCDEF)110011011110111100000000101010112.3.4 实型变量C语言的实型变量分为单精度型(float型)、双精度型(double型)和长双精度型(long double型)三类。对每一个实型变量都应在使用前加以定义。如:float x, y; / 定义x、y为单精度实型变量double z; / 定义z为双精度实型变量实数的有效数字位数和数值的范围随机器系统而异。在IBM PC中,一个float型数据在内存中占4个字节(32位),一个double型数据占8个字节(64位),一个long double型数据占10个字节(80位)。单精度实数提供67位有效数字,双精度实数提供1516位有效数字,长双精度实数提供1819位有效数字;单精度实数的数值范围约为3.410-383.41038,双精度实数范围约为1.710-3081.710308,长双精度实数范围为3.410-49321.1104932。应当说明,实型常量不分float型和double型。一个实型常量可以赋给一个float型或double型变量,根据变量的类型截取实型常量中相应的有效位数字。例如:float a;a=222222.222;由于float型变量a只能接收7位有效数字(即a=222222.2),因此最后两位小数不起作用。如果a改为double型,则能全部接收上述9位数字并存储在变量a中。2.3.5 字符型变量1字符型变量字符型变量(简称为字符变量)可以存放单个字符型数据。例如:char cl, c2;表示cl和c2为字符型变量,各可以存放一个字符。我们可以用下面的语句给它们赋值:cl=a;c2=b;注意:(1) 系统分配一个字节大小的单元给字符型变量。(2) 对于字符型变量,存储单元中存放的是字符的ASCII码。如c1、c2的存储形式如图2-3所示。01100001c101100010c2图2-3 字符数据的存储形式(3) 由于在内存中,字符型数据是以ASCII码形式存储的,它的存储形式与整数的存储形式相类似,所以C语言的字符型数据和整型数据可以通用。因此,C语言中的字符数据和整型数据可以相互赋值;并且字符数据可以以字符形式输出,也可以以整数形式输出。例2.4 字符型数据的整型处理。#include void main() char c1, c2, c3;c1=a;c2=97;c3=c1-32;printf(%c, %c, %c, c1, c2, c3);printf(%d, %d, %d, c1, c2, c3);运行结果如下:a, a, A97, 97, 65分析:其中c1、c2、c3被定义为字符型变量,然后给c1、c2分别赋予字符常量a、整数97,而C语言对于a,和97在内存中的存储形式是完全一样的;c3赋予一个算术表达式c1-32(其值为65,对应字符为A)。上述程序中从a到A的变换是c3=c1-32。C语言对字符数据作这种处理使程序设计增大了自由度,因而对字符作各种转换就比较方便。提醒读者注意,将一个整数赋给一个字符型变量时,该整数应在0255范围内,否则会产生溢出。(4) 无符号字符型标识符unsigned char的使用。在Turbo C系统中,将字符型变量所占用的字节的最高位当成符号位,或者说把字符处理成带符号的整数。如:字符a:01100001它的最高位(8位中最左一位)为0,此字符按整数形式输出时就输出一个正整数,它的值就是ASCII码的值97。字符376:11111110它的最高位为1,内存中被视为负数,如按字符形式输出则是系统中相应的图形字符,在IBM PC上为字符;如将它按整型输出,输出结果是-2,因为-2的补码为11111110。如果字符型变量说明为unsigned char型数据,即无符号字符型变量,其最高位不作为符号位。例2.5 无符号字符数据。#include void main() unsigned char c=376;printf(%c, %d, c, c);运行结果如下:, 254这是由于11111110的十进制数值为254。2字符数据与字符串数据的区别字符数据与字符串数据不仅仅是书写形式和字符的个数不同,它们在内存中的存储形式也是有较大区别的。在C语言中,每一个字符串的结尾系统自动加上一个字符串结束标志0,以便系统据此判断字符串是否结束。0是一个ASCII码为0的字符,是“空操作字符”,即它不引起任何控制动作,也不是一个可显示的字符。我们可通过比较a、a、HELLO在内存中存储形式的不同(如图2-4所示),了解字符常量与字符串常量的区别。其中,字符a占1个字节的存储空间,字符串a占2个字节的存储空间,字符串HELLO占6个字节的存储空间。a0110000101100001a000000000aLHELLO01001000H01000101E01001100L0100110001001111O000000000图2-4 字符与字符串的存储比较例如:char c1, c2, c3;c1=a;c2=a; / 错误的赋值语句c3=HELLO; / 错误的赋值语句一个字符串不能赋给一个字符型变量。说明:(1) 字符串在输出时并不输出0。例如:printf(%S, HELLO);将逐个字符输出HELLO,直到遇到最后的结束符0,就知道字符串结束,停止输出。(2) 在写字符串时不必加0。讲到这里,有人要问,C语言中如何定义字符串变量呢?在C语言中,并没有直接的字符串变量的概念,但是可以通过字符数组和字符指针变量来实现字符串变量的作用(详见第6章和第8章)。2.3.6 限定词const如果想让变量的内容自初始化后一直保持不变,则可以使用变量的限定词const。例如:float x=345.67;const float pi=3.1415926;虽然系统给变量x、pi都分配了4个字节,但是变量x的值是可以变化的(通过重新赋值),而变量pi受到const的限定,这意味着不能重新给pi赋值,它相当于一个float型的常量3.1415,即变量pi的作用实际上相当于常量。如:x=890.12; / okp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论