第2章C语言.pdf
《第2章C语言.pdf》由会员分享,可在线阅读,更多相关《第2章C语言.pdf(104页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、第2章 数据与操作在任何程序中,数据和对数据的操作都是最为基本的内容。即是说围绕着存放在哪里的数据将进行怎样的操作。数据及其相互关系构成了数据结构。对某种数据的描述及数据存取的使用规则正确与否将直接影响解决问题的算法效率和复杂程度;对数据的操作方法则体现了解决此问题的算法,这是组成程序的两个基本要素。在计算机语言中,数据结构要以数据类型和存贮属性为基础,而算法的具体实现则依赖语言中所形成的各种运算。本章将围绕这两部分基本内容展开讨论,介 绍C语言最基本的数据类型,常见运算及其构成的表达式以及基本的输入输出操作。0 2.1数据类型通过第一 章 图L 3 T算法动作分解图的介绍,我们已经基本了解了
2、计算机执行程序算法的基本原理。但是,举例中存放在存贮单元的数据都是假设为整数,而且是0和正整数。但是,实际问题的需要并非如此。如果要求的数是负整数或正负小数怎么办?如果存放的数据是英文字符或汉字又该怎么办?另外受数据值的表示范围和小数点精度的影响,到底应该使用多大的空间(多少存储单元)来盛装它?面对其它的复杂操作,数据又要以什么样的结构来组织存贮?这些问题都要在数据类型中解决。换句话说,程序设计者即要知道他使用的数据是以什么样数据类型存放,又要知道这种类型的数据应该怎样操作。从现在开始,就要清楚地认识到:通过学习C/C+语言的语法规则,使用C/C+编译器能够识别的符号及表示方法,将要解决的问题
3、的算法书写成程序,在 C/C+的源文件中,这些程序就是告诉C/C+的编译器即计算机你所要表达的计算信息。C 语言中数据类型十分丰富。本节介绍基本类型,其他类型在后续章节中介绍。C 语言中的数据类型包括以下几种:整型(int)/典 本 类 开H 4+上 实型C字点型)单精度 数组类型(口)构 造 结构体类型(struct)数据类型】-1_*_1 F ile s3)exanple1_ii_1.c*exanple1_M_1_1.c2JAddress:|0 x0012tf74include include void nain()IkUin t t o t a l,;total-100;p&total;
4、print F(,td v%xu.to ta lvp);变量total的值是100存储在12fF7c单元中0012FF59CC CC CC CC CC CC CC CC J t C CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CCB012FF7H CC CC CC CC 7C FF 12 00 应 小 E C8 FF 12 00 79 12 Q6 01 00 00 00 86 0E&38S12FF8F 00 CO O D M3 00 00 00 00 00 OU 00 00 00 00 FO Ff)7F RR no an nA nn an n an
5、 FF0012FFAA 12 00 00 00 07 00 EO FF 12 00 9H 3E“0 00 300012FFC5 1A E7 77 00 00 06 00 00 00 00 00 00 F0 FD 7FO012FFES FF FF FF FF 97 E5 E6 77 00 1B E7 77 00 00 000012FFFB OS 00 00 80 00 C8 00 UO 00 00 81 00 00 FF EE线裂煲烫烫煲烫烫烫烫烫烫煲.3.ii.y.a a.c 1习 Context:jmainQNamenx0012Ff7ctotal86amestel_S Woos.|_sl第2
6、量Cifi百Ready 开 闻l|与 1 2Citt-Mcrostf”.|g c:MyDoajwe6trtexai j R(B 4k.16:33XJr三1、多 他,“余每个变量使用前必须进行定义。在 C 语言中,要求对所有用到的变量必须定义其名字和类型,也就是“先定义,再使用。如 int x;x=10;或同时:int x=10;o 若 student=30;未定义直接赋值将出现“c2065:studentundeclared identifier”的错误信息。委变量名的取名规则。使用有效字符序列来标识变量名,符号常量名,函数名,数组名,类型名,文件名(标识符identifier参 见 2.1.
7、4小节)等。规则为:只能用英文字母、数字和下划线组成,第一个字母必须是字母或下划线。大小写敏感。如Sum和 sum是不同的两个变量。一般变量名用小写。合 法 变 量 名 举 例:sum,average,total,Class,Student name,lotus 1 2 3,BASIC 等。不合法变量名举例:M.D.John,123,#33,3D64。泰变量名的意义与长度。取变量名时,尽量取与其意义相关的英文词或缩写组合,但不能与系统保留的关键字相同(关键字参见2.1.4小节)。为方便起见,在本书中所定义的变量 多 为 a,b,c,x,y,z,但是为了增加程序的可读性,建议读者不要在程序中采用
8、。变量名长度,VC+6.0环境下的系统最多识别32个字符。由于各个C 编译系统都有自己的规定,为了程序的可移植性,建议不超过8 个字符。吸每个变量在定义时必须指定该变量的数据类型。这样即可在编译时系统能为其分配相应数量的存贮单元,如 inta,b;VC+6.0编译系统为a,b各分配4B(4 个字节),按整数方式存贮数据;也可以在编译时据此检查该变量将进行的运算是否合法。如 a%b(求余操作,即取a/b的余数),若 a,b定义为实型则不允许,给 出“错误消息”。喷变量定义须放在程序的前面。目的是在程序编译开始时即申请用于存放数据的存放空间,为后续变量的使用做好准备。O注意喷 由于在程序中书写常量
9、数据的习惯和计算机内存存储该数据存在着差异,所以表示数据的时候,采用左高位,右低位。如 100的 4B 二进制形式为最高位00000000 00000000 00000000 0110010031.0而在内存的存储形式,内存地址从低到高排列,系统将该变 量 的4个字节的低位字节存放在低地址单元,后面依次类推,4个字节的最高位字节存放在高地址单元。字节内各位顺序不变。并将变量名total与4B中的最低字节的地址对应(如例 中12ff7c).o如图2.1-1所示。如遇第7位向第8位进位时,则跨字节存储。最高位在31位。在编译器中打开内存窗口,地址显示从低到高(既从上至下,又从左至右),所以俗称“倒
10、装”,参见图2.17(b)。2.1.1整型数据没有小数点的正、负整数和。的数据。1.整型常量C语言中,整型数可用3种不同的数制表示。整型常量即为整型常数,常出现在赋值符号“=”的右值。(1)十进制数数字为09,如789,-123,0等。或为了区别同八进制、十六进制的混淆,在手写表示中用括号加进制下标说明,但不能在源程序中书写。因 为C编译系统自动识别并没有任何进制表示的常量默认十进制数。比如可写成(789)io,(-123)10o(2)八进制数以0(零)开头的数表示八进制。使用数字07,告诉编译系统该常数为八进制。如0234代表八进制数,或手写成(234)8O 它等于十进制数 2X82+3X8
11、1+4X8=156O(3)十六进制数以Ox(零和小写x)开头的数表示十六进制数。使用数字09与AaFf。如0 x7a代表十六进制数,或手写成(7A h。它等于十进制数7X 16U10X 16=122o2.整型变量整型变量根据实际需要,按定义变量使用内存存贮单元(以字节为单位)的多和少又分为整型,短整型,长整型和无符号型几种。其一般的定义形式为数值类型变量名表;其中变量名表中的变量可为1个或多个。如果为多个,则用逗号隔开。如 inta,b,c;。(1)短整型如果为节省内存空间,可 用short in t表示或以short表示,系统留出2B。取值范围从-3276832767,即-2匕程序中用到的数
12、据不能超过这个范围,否则结果将出现错误。如果程序中要用到数据大于这个范围,须定义成其它类型。数据表示范围见图(2)整型以int表示,取integer整数的意思。如int a表示变量a为整型变量。在32位字长的计算机中编译时,系统为其留出4B。取值范围从-21474836482147483647,即31(23寸)。数据表示范围见图2.1-2o(3)长整型以long int表示或以long表示。系统为其留出4B(32位)空间。它的取值范围从-21474836482147483647,BP-231-(23,-1)O数据表示范围同整型见图2.1-2。15.0 符号位.0-32768 10000000
13、00000000 00000000 00000000 1-214748364816()00000 00000000 00000000 00000001 J-214748364711111111 11111111 11111111 11111111-1012147483647图2.1-1短整型数据范围(补码存储)图2.1-2整型、长整型数据范围(补码存储)(4)无符号型无符号型是指不带符号的数据,原符号位二进制数参与表示整型数据。在二进制最左边的一位,不再是符号位,而是与右边各位一起用来表示数值,使得表示数的最大值扩大了一倍。无符号型又分无符号短整型,以unsigned short表示;无符号整
14、型,以unsigned int表示;无符号长整型,以unsigned long表示。无符号短整型系统为其留出2B的内存空间。由于最高位已不代表符号位,是数值的一部分。它 的 取 值 范 围 为。(216-1);无符号整型和无符号长整型系统留出4B的内存空间。取值范围从0-4294967295,即0-(232-1)。数据表示范围见图 2.1-3(a)(b)o最高位不作符号最高位不作符号oF.0r00000000 00000000Z/00000000 000000016J53511111111 11111111图2.17(a)无符号短整型数据范围3.300000000 00000000 00000
15、000 0000000010000000 00000000 00000000 00000001 U 42,496729511111111 11111111 11111111 11111111图2.1 3(b)无符号整型、长整型数据范围整型数据在使用时,还应该注意以下几个问题。O注意余整型数据的补码表示。C语言编译系统识别源程序的整型数据以后,为了方便处理数据和存贮数据,引入了原码和补码的概念。处理和存贮数据均是以补码(complement)的形式进行,无论字节的多或少。也就是说所有的正、负整数都是以补码形式表示和存贮。若处理和存储一个正整数,该数值二进制形式最高位为“0”一表示正整数。它的补码
16、也是它的原码(包括零)。如图2.1-1 和图2.1-2 的最高位为0的所有数值。若处理和存储一个负整数,其二进制形式最高位为“1”,以该数值的补码形式表示或存贮。如图2.1-1 和图2.1-2 的最高位为1 的所有数值,-3 2 7 6 7 的补码为1 0 0 0 0 0 0 1 o求负数的补码的方法是:将该数的绝对值的二进制形式,按位取反再加1。比如求-1 0 0 的补码,首先取-1 0 0 的绝对值为1 0 0 ,100的 二 进 制 形 式(短 整 型 为 例)原 码 为0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0,再各位取反为 1 1 1 1 1 1 1 1 1 0
17、0 1 1 0 1 1,最后加1,即为(1 1 1 1 1 m i 0 0 1 1 1 0 0)2=(F F 9 C)i 6。如果通过补码求数值则过程相反:首先最高位为“1”,其数值为负数,再 减 1 各位取 反 后 为(0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0)2=1 0 0,即-1 0 0。也就是说(F F 9 C.6 是-1 0 0 的补码。请记住几个重要的数值的补码,对以后的学习有帮助。仍以短整为例,其余多字节原理相同。只要是未说明数据类型为无符号整型。符号位即表示正或负。如图2.1-4 所示。11111111 11111111-1符号位15.010000000
18、00000000)-32768001111111 11111111 U32767图2.1-4几个重要数值的补码理整型数据的溢出问题。仍以短整为例,在图2.1-4中,数据的最大上限为32767。如果再加1,会出现什么情况呢?请看如下程序运行的结果。例 2.1 T 整型数据的溢出。#include void main()short a,b;a=32767;b=a+l;运行结果32767,-32768从运行的的结果来看,并没有到达我们预想的结果32768 o 这是因为出现了“溢 出”问题。我们已经知道(0111111111111111)2=32767,加 1 后为(1000000000000000)
19、2。此时最高位为“1”,使得该数值既是负数,又是补码。从图2.1-4中得知这是-32768的补码形式,所以输出结果必然是-32768o也就是说一个整型变量只能容纳-3276832767范围的数,无法表示大于32767的数,就 发 生“溢出”。但是运行时并不报错,一切由程序设计者自己把握。只要把a,b换成int整型即可消除这个隐患。喷其它版本的C编译器对整型数据的字节数定义不同。整型数据的字节数在C标准中没有规定,完全依不同的CPU字长(w ord,有32位 和16位)和C编译器而定。通常的做法是把10ng长整型定为32位(4 B),把short定 为16位(2B),而int既可以定为16位,也
20、可以定为32位(4 B),VC+6.0采用in t为32位。余整型常量的类型。整型变量有short、int、long和unsignedshort unsigned int unsighed long 等;常量也分属上述类型。一个整数常量其值不要超出它所要赋值的整型变量的表示范围。另外,在整型常量中,长整型可以写成15L(或151);无符号整型数可以写成如26U(或26u)。其中L(或1),U(或u)为后缀 表 示。如果遇有-12345U,则先将-12345转换成其补码(CFC7)i6=53191,然后按无符号存贮。效果同-12345。而12345U则按无符号数存放,最高位不作符号,用来存贮数据
21、。2.1.2实型数据含有小数的数为实型数,又称浮点型数。1.实型常数(1)十进制形式如0.789,.789,789.0,789.,0.0等都是十进制形式的实数,每个数中都包含了数字和小数点。(2)指数形式如 6.23e2 或 6.23E2 都代表 6.23 X 102=623 o-6.23e2,428e2,-428e-2也都是合法的指数形式。每个数中,在e(或E)的前面必须有数字为底数;在e(或E)的后面的指数必须为整数。最前面的负号表示负数(无负号为正数);在e(或E)的后面指数的正、负号和整数,表示小数点还原时要向右或向左移动的方向和位数。如6.23E2代表还原后的623o像e2,7e2.
22、2,e等都是非法。实数的指数形式表示又称为科学表示法。由于小数是浮动的,所以一个实数可以有多种指数表示形式。但是,在存贮和输出时均采用规范指数形式。比如,指定将实数5689.65按指数形式输出,必 会 输 出5.68965e+003,不 会 是0.568965e+004或56.8965e+002o也就是说小数点左只留一位有效数字。为了将浮点数存储起来,当然要以二进制浮点形式表示并存储。编译系统采用类似十进制的科学表示法编码。如同对应的十进制用小数点分隔整数部分和小数部分一样,浮点数也可以表示成含有二进制小数点的常规二进制格式。例如二进制数1001.l l o 二进制小数点左边的数字(10 1
23、1)表示这个数的整数部分,二进制小数点右边的数字表示小数部分。一个常规的二进制数被分成底数(mantissa)和指数(exponent)部分。例如:常规二进制表示法二进制科学表示法1010.0l.OleOll-10001.0-l.OOOlelOO0.0011011.101e-011-0.000101-1.01e-100二进制科学表示法中的e(exp-exponent)表示指数。e 前的二进制数是浮点的底数,小数点前总是保留一位为1,负数要加上负号(无负号为正数)。e 后的二进制数是指数。指数表示2 的幕,即指明二进制小数点应该在底数中移动的位数以得到常规的二进制表示。如果指数是正数,二进制小数
24、点向右移。如果指数是负数,小数点向左移,如 l.O leO ll,意味小数点右移3 位,这个数为1010。图 2.1-5为二进制浮点的表示和存储,以单精度格式为例。其它各个精度原理相同,只是字节数不同而已。单精度数据格式32位(4B):高位在左,低位在右,符 号 位 I b it,底 数 位 23bit,指数为8 b i to双精度数据格式64位(8B):IWJ位在左,低位在右,符号位I b i t,底数位5 2 b i t,指数为l i b i t。长双精度数据格式80位(1 0 B):IWJ位在左,低位在右,符号位I b i t,底数位6 4 b i t,指数为1 5 b i t o符号位
25、 指数 底数31 30 2322 00 0000000 0 0000000 00000000 00000000小数点隐含位置图 2.1-5 单精度浮点数的格式(在内存中以存储形式)图2.1-5中的符号位表示底数的符号。符号位为1表示负数,为0表示正数。由于除0以外,所有的底数的二进制小数点前面都有一个1,所以这个“1”和 小 数 点 这 两 项并不显式地表示和存贮。也就是说在表示和存储该数时找不到最前面的“1”和 小 数 点。换句话说,二进制小数点隐含在底数部分的第22位的左边(如图所示),并且该位置左侧(前面)总有个假想的1,这个1并不表现出来,存贮是默认的。把所有的底数和指数位都设置为0就
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言
限制150内