您好,欢迎访问三七文档
第2章数据与操作在任何程序中,数据和对数据的操作都是最为基本的内容。即是说围绕着存放在哪里的数据将进行怎样的操作。数据及其相互关系构成了数据结构。对某种数据的描述及数据存取的使用规则正确与否将直接影响解决问题的算法效率和复杂程度;对数据的操作方法则体现了解决此问题的算法,这是组成程序的两个基本要素。在计算机语言中,数据结构要以数据类型和存贮属性为基础,而算法的具体实现则依赖语言中所形成的各种运算。本章将围绕这两部分基本内容展开讨论,介绍C语言最基本的数据类型,常见运算及其构成的表达式以及基本的输入输出操作。2.1数据类型通过第一章图1.3-1算法动作分解图的介绍,我们已经基本了解了计算机执行程序算法的基本原理。但是,举例中存放在存贮单元的数据都是假设为整数,而且是0和正整数。但是,实际问题的需要并非如此。如果要求的数是负整数或正负小数怎么办?如果存放的数据是英文字符或汉字又该怎么办?另外受数据值的表示范围和小数点精度的影响,到底应该使用多大的空间(多少存储单元)来盛装它?面对其它的复杂操作,数据又要以什么样的结构来组织存贮?这些问题都要在数据类型中解决。换句话说,程序设计者即要知道他使用的数据是以什么样数据类型存放,又要知道这种类型的数据应该怎样操作。从现在开始,就要清楚地认识到:通过学习C/C++语言的语法规则,使用C/C++编译器能够识别的符号及表示方法,将要解决的问题的算法书写成程序,在C/C++的源文件中,这些程序就是告诉C/C++的编译器即计算机你所要表达的计算信息。C语言中数据类型十分丰富。本节介绍基本类型,其他类型在后续章节中介绍。C语言中的数据类型包括以下几种:由这些数据类型还可以构成更复杂的数据结构。例如利用指针和结构体类型可以构成表、树、栈等复杂的数据结构。常量和变量程序中的操作数据不是常量就是变量。它们分别属于以上的类型。常量:♣常量在使用时不需要任何类型说明,编译器自动的识别。因为它来自书写在源文件整型(int)实型(浮点型)字符型(char)单精度(float)双精度(double)数组类型([])结构体类型(struct)共用体类型(union)基本类型构造类型指针类型(*,&)枚举类型(enum)空类型(void)数据类型中的程序。♣在程序执行的过程中,常量的值是可能由程序改变的。♣常量出现在赋值符号“=”的右值(关于左值、右值请参见知识要点)。♣常量又分为:数值常量(数值常量又分整型常量、实型常量)、字符常量、字符串常量、符号常量(符号常量将在第6章编译预处理中介绍)。♣常量一般从其字面形式即可判断。也称字面常量或直接常量。♣常量举例:#definePRICE30;inttotal=100;intx=10;floata=-3.5f;charc=’A’;charch[]=”China!”;。变量:在前面的常量的举例中,其中inttotal=100;为定义变量的同时并赋值,也可以写成inttotal;total=100;,即先定义,而后赋值。出现在右值的是常量,那么左边的左值代表什么?这样写是想告诉编译系统什么信息?这样写的意图是先向系统申请一个空间,int(integer整型缩写)说明要存放整型数据并保留4B,起名为total,再把常量100存入到(赋值给)名为total的内存单元中。该程序编译连接时,系统在内存中分配一个名字为total的内存存贮单元,用4个字节来存放整数100。现在,在系统内部就有了名字total和这个内存单元的物理地址的一一对应关系。若再往这个名为total的存贮单元写入101时,即total=101;则原先存入的100被覆盖了,100已消失取而代之的是101。由于名为total单元所存入的不同的值是变化的,我们把total称做变量名,简称变量。换句话说,其值是可由程序改变的量称为变量。存贮形式见图2.1-1(a)。数值常量字符常量字符串常量符号常量常量整型常量实型常量inttotal=100;011001000000000000000000000000007---------015--------823------1631------240012ff7c0012ff7d0012ff7e0012ff7f变量值变量名内存高地址内存低地址为整型数据申请并保留4B内存空间图2.1-1(a)内存的存储形式从图中可知,一个变量应该有一个名字,在内存中占据一定的存贮单元(具体占用多大,和数据类型有关,后面将介绍)。在该存贮单元中存放变量的值。请注意区分变量名和变量值这两个不同的概念。其实,变量名只是一个符号地址。系统给每一个变量名对应一个已分配的内存地址。在程序中从变量中取值(读出)或赋值(写入),实际上是通过变量名找到相应的内存地址,并完成对数据的操作。见下图2.1-1(b)所示。♣每个变量使用前必须进行定义。在C语言中,要求对所有用到的变量必须定义其名字和类型,也就是“先定义,再使用”。如intx;x=10;或同时:intx=10;。若student=30;未定义直接赋值将出现“c2065:’student’:undeclaredidentifier”的错误信息。♣变量名的取名规则。使用有效字符序列来标识变量名,符号常量名,函数名,数组名,类型名,文件名(标识符identifier参见2.1.4小节)等。规则为:只能用英文字母、数字和下划线组成,第一个字母必须是字母或下划线。大小写敏感。如Sum和sum是不同的两个变量。一般变量名用小写。合法变量名举例:sum,average,_total,Class,Student_name,lotus1_2_3,BASIC等。不合法变量名举例:M.D.John,¥123,#33,3D64。♣变量名的意义与长度。取变量名时,尽量取与其意义相关的英文词或缩写组合,但不能与系统保留的关键字相同(关键字参见2.1.4小节)。为方便起见,在本书中所定义的变量多为a,b,c,x,y,z,但是为了增加程序的可读性,建议读者不要在程序中采用。变量名长度,VC++6.0环境下的系统最多识别32个字符。由于各个C编译系统都有自己的规定,为了程序的可移植性,建议不超过8个字符。♣每个变量在定义时必须指定该变量的数据类型。这样即可在编译时系统能为其分配相应数量的存贮单元,如inta,b;VC++6.0编译系统为a,b各分配4B(4个字节),按整数方式存贮数据;也可以在编译时据此检查该变量将进行的运算是否合法。如a%b(求余操作,即取a/b的余数),若a,b定义为实型则不允许,给出“错误消息”。变量total的值是100存储在12ff7c单元中♣变量定义须放在程序的前面。目的是在程序编译开始时即申请用于存放数据的存放空间,为后续变量的使用做好准备。注意♣由于在程序中书写常量数据的习惯和计算机内存存储该数据存在着差异,所以表示数据的时候,采用左高位,右低位。如100的4B二进制形式为而在内存的存储形式,内存地址从低到高排列,系统将该变量的4个字节的低位字节存放在低地址单元,后面依次类推,4个字节的最高位字节存放在高地址单元。字节内各位顺序不变。并将变量名total与4B中的最低字节的地址对应(如例中12ff7c).。如图2.1-1所示。如遇第7位向第8位进位时,则跨字节存储。最高位在31位。在编译器中打开内存窗口,地址显示从低到高(既从上至下,又从左至右),所以俗称“倒装”,参见图2.1-1(b)。2.1.1整型数据没有小数点的正、负整数和0的数据。1.整型常量C语言中,整型数可用3种不同的数制表示。整型常量即为整型常数,常出现在赋值符号“=”的右值。(1)十进制数数字为0~9,如789,-123,0等。或为了区别同八进制、十六进制的混淆,在手写表示中用括号加进制下标说明,但不能在源程序中书写。因为C编译系统自动识别并没有任何进制表示的常量默认十进制数。比如可写成(789)10,(-123)10。(2)八进制数以0(零)开头的数表示八进制。使用数字0~7,告诉编译系统该常数为八进制。如0234代表八进制数,或手写成(234)8。它等于十进制数2×82+3×81+4×80=156。(3)十六进制数以0x(零和小写x)开头的数表示十六进制数。使用数字0~9与Aa~Ff。如0x7a代表十六进制数,或手写成(7A)16。它等于十进制数7×161+10×160=122。2.整型变量整型变量根据实际需要,按定义变量使用内存存贮单元(以字节为单位)的多和少又分为整型,短整型,长整型和无符号型几种。其一般的定义形式为数值类型变量名表;其中变量名表中的变量可为1个或多个。如果为多个,则用逗号“,”隔开。如inta,b,c;。0000000000000000000000000110010031………………………………………..0最高位(1)短整型如果为节省内存空间,可用shortint表示或以short表示,系统留出2B。取值范围从-32768~32767,即-215~(215-1)。程序中用到的数据不能超过这个范围,否则结果将出现错误。如果程序中要用到数据大于这个范围,须定义成其它类型。数据表示范围见图2.1-1。(2)整型以int表示,取integer整数的意思。如inta表示变量a为整型变量。在32位字长的计算机中编译时,系统为其留出4B。取值范围从-2147483648~2147483647,即-231~(231-1)。数据表示范围见图2.1-2。(3)长整型以longint表示或以long表示。系统为其留出4B(32位)空间。它的取值范围从-2147483648~2147483647,即-231~(231-1)。数据表示范围同整型见图2.1-2。(4)无符号型无符号型是指不带符号的数据,原符号位二进制数参与表示整型数据。在二进制最左边的一位,不再是符号位,而是与右边各位一起用来表示数值,使得表示数的最大值扩大了一倍。无符号型又分无符号短整型,以unsignedshort表示;无符号整型,以unsignedint表示;无符号长整型,以unsignedlong表示。无符号短整型系统为其留出2B的内存空间。由于最高位已不代表符号位,是数值的一部分。它的取值范围为0~(216-1);无符号整型和无符号长整型系统留出4B的内存空间。取值范围从0~4294967295,即0~(232-1)。数据表示范围见图2.1-3(a)(b)。15…………………0符号位1000000000000000-327681000000000000001-327671111111111111111-1000000000000000000000000000000001101111111111111113276731……………………………………….0符号位10000000000000000000000000000000-21474836481000000000000000000000000000000111111111111111111111111111111111-1000000000000000000000000000000000000000000000000000000000000000011011111111111111111111111111111112147483647-2147483647图2.1-1短整型数据范围(补码存储)图2.1-2整型、长整型数据范围(补码存储)负整数以补码形式存储负整数以补码形式存储负整数以补码形式存储正整数以原码形式存储整型数据在使用时,还应该注意以下几个问题。注意♣整型数据的补码表示。C语言编译系统识别源程序的整型数据以后,为了方便处理数据和存贮数据,引入了原码和补码的概念。处理和存贮数据均是以补码(complement)的形式进行,无论字节的多或少。也就是说所有的正、负整数都是以补码形式表示和存贮。若处理和存储一个正整数,该数值二进制形式最高位为“0”—表示正整数。它的补码也是它的原码(包括零)。如图2.1-1和图2.1-2的最高位为0的所有数值。若处理
本文标题:第2章C语言
链接地址:https://www.777doc.com/doc-2246706 .html