第二章 数据对象与计算
计算机程序处理数据,写程序就是描述数据的处理过程,其中必然涉及数据的描述和计算问题。例如,在C程序里可以写出下面片段,这是一个表示了某种计算过程的“表达式”,其中包含了一些“数据”,如整数和实数等::
-(3.24 * 5 + sin(2,3)) / 4 * 6.24
要理解这种表达式,写程序时知道如何写出所需表达式,就必须知道C语言对各种数据的写法(术语是数据的描述)有什么规定:在表达式里可以写什么?它们表示什么意思?写出的表达式表示了什么计算过程?有关计算的结果是什么?本章首先解决这些问题。
本章将首先讨论C语言中各种基本数据的描述,然后介绍如何从基本数据元素出发描述计算,如何写好能求出所需结果的表达式。在这一章里,读者将初步接触到计算机领域的许多重要概念,看到它们在简单程序中的地位和作用。
2.1基本字符、名字表示、标识符和关键字
一个C程序就是C语言基本字符的一个符合规定形式的序列。C语言基本字符包括:
1. 数字字符,0,1,2,3,4,5,6,7,8,9;
2. 大小写拉丁字母:a~z,A~Z;
3. 其他一些可打印(可以显示)的字符(如各种标点符号、运算符号、括号等),包括:
~!%&*()_-+={}[]:;"'<>,.?/|\
现在不必死记这些,随着学习进展,读者将很容易记住这些字符的意义和作用。
4. 还有一些特殊字符,如空格符、换行符、制表符等。
空格符、换行符、制表符等统称为空白字符。空白字符在程序中主要用于分隔其他成分。
按规定,C程序中大部分地方增加空白字符都不影响程序意义。因此人们写程序中常利用这种性质,通过加入一些空白字符,把程序排成适当格式,以增强程序的可读性。例如,在适当地方换行,在适当地方加空格或制表符。这样能使程序的表现形式更好反映其结构和所实现的计算过程。举例说,第1章的简单C程序也可以写成下面样子:
#include <stdio.h>
int main(){printf("Good morning!\n");return 0;}
这明显不如前面的写法清晰。对更大的程序情况则会更糟糕。本书后面讨论中还会提出对各种程序成分的较好写法,书中程序示例也反映了这方面的情况。
构成C程序的基本成分包括各种名字(如上面出现的main、printf等等),各种数值表示(如125、3.14等等),各种运算符和其他符号。
名字(标识符)的构成
程序中有许多需要命名的对象。例如,程序中常常需要定义一些东西,以便在各处使用。为了在定义和使用之间建立联系,表示不同位置用的是同一个对象,基本的方式就是为程序对象命名,通过名字建立起定义与使用间、同一对象的不同使用间的联系。为了这种需要,C语言规定了名字的书写形式。程序中的名字称为标识符。
一个标识符是字母和数字字符的一个连续序列,其中不能有空白字符,而且要求第一个字符必须是字母。为了方便起见,C语言特别规定将下划线字符“_”也当作字母看待。这就是说,下划线可以出现在标识符中的任何地方,特别是可以作为标识符的第一个字符。下面是一些标识符的例子:
abcd    Beijing  C_Programming  _f2048  sin    a3b06
xt386ex    A_great_machine    Small_talk_80    FORTRAN_90
以下划线开始的标识符保留给系统使用,在我们编写普通程序时不要使用这种标识符,以免与系统内部的名字冲突造成程序问题。
如果一个字符序列中出现了非字母、非数字、也非下划线的字符,那么它就不是一个标识符了(但有可能其中一部分是个标识符,例如x3+5+y,其中x3和y都是标识符,中间的+5+不属于这两个标识符)。下面是一些非标识符的字符序列:
+=    3set  a[32]  $$$$  sin(2+5)    ::ab4==
C语言还规定,标识符中同一字母的大写形式和小写形式将看作不同字符,这样,a和A不同,name、Name、NAME、naMe和nMAE是互不相同的标识符。
关键字
C语言的合法标识符中有一个特殊的小集合,其中的标识符称为关键字。作为关键字的标识符在程序里具有语言预先定义好的特殊意义,因此不能用于其他目的,不能作为普通的名字使用。C语言关键字共32个,列在这里:
auto break
case char
do const continue
default
double else enum extern
float for goto if
register
return int long
short signed sizeof static
union struct switch typedef
unsigned void volatile while
现在不准备对它们做更多解释。随着书中讨论的进展,读者会一个一个地接触并记住它们。目前只需要了解关键字这一概念。
除了不能使用关键字之外,我们写程序时几乎可以用任何标识符为自己所定义的东西命名,所用的名字可以自由选择。通过长期程序设计实践,人们认识到命名问题并不是一件无关紧要的事情。合理选择程序对象的名字能为人们写程序、读程序提供有益的提示,因此人们倡导采用能说明程序对象内在含义的名字(标识符)。
注读者注意,命名问题并不是C语言中特殊的东西,每种程序语言都必须规定程序中名字的形式,在计算机领域中到处都用到名字。例如,计算机里的文件和目录,各种应用程序和系统,图形界面上的图标和按钮,甚至计算机网络中的每台计算机,都需要命名。采用适当命名形式的原则在计算机领域中具有广泛适用性。
2.2数据与类型
数据是程序处理的对象。C语言把程序能处理的基本数据对象分成一些集合。属于同一集合的数据对象具有同样性质:采用统一的书写形式,在具体实现中采用同样的编码方式(按同样规则对应到内部二进制编码,采用同样二进制编码位数),对它们能做同样操作等等。语言中具有这样性质的一个数据集合称为一个类型。
从关于计算机基础知识可知,计算机硬件处理的数据也分成一些类型,通常包括字符、整数、浮点数等,CPU为不同数据类型提供了不同的操作指令。例如,对整数有一套加减乘除指令,对浮点数有另一
套加减乘除指令等。程序语言中把数据分成类型与此有密切关系。但类型的意义不仅于此,实际上,类型是计算机科学的核心概念之一。在学习程序设计和程序设计语言的过程中将不断与类型打交道。请读者特别注意这一概念。
C 语言的基本类型包括字符类型、整数类型、实数类型等。请读者特别注意:(1)程序中书写的、执行中处理的每个基本数据都属于某个确定的基本数据类型;(2)类型确定了属于它的数据对象的许多性质,特别是确定了数据的表示范围。在具体C 语言系统里,基本类型都有确定表示(编码)方式,这就确定了可能表示的数据范围。例如,一个整数类型中的所有整数只是数学中整数的一个子集,其中只包含有限个整数值,存在该类型能表示的最小和最大整数。其他整数在这个类型里没有容身之地,无法在这个类型中表示。
下面会看到这些基本情况的影响。
2.3 基本类型与数据表示
C 语言提供了一组基本基本类型,并规定了“类型名”。基本类型的名字由一个或几个标识符(关键字)构成,其形式与前面讲的“名字”有所不同。本节将介绍几个最常用的类型。不在这里介绍所有基本类型,是希望能尽快进入讨论的主题——程序与程序设计。这几个基本类型对前几章也足够了。后面章节将对所有基本类型做全面的介绍。
首先应提出文字量的概念。文字量就是程序里直接写出的数据。例如,程序里直接写出的整数类型的数据就称为“整型的文字量”。为简单起见,也常把整型文字量简称为“整数”,其他情况也采用类似称呼方式,后面常用这种简称,只在特别需要时才用更严格的说法。C 语言规定了各种基本类型的文字量的书写形式,这也是本节的主要内容。
2.3.1 整数类型和整数的表示
C 语言提供了多个整数类型以适应不同需要。不同整数类型间的差异在于它们可能具有不同的二进制编码位数,因此表示范围可能不同。程序中用的最多是一般整数类型(今后简称为“整数类型”或“整型”)和长整数类型(简称“长整型”)。整数类型的类型名是int ;长整型的类型名为long int ,可简写为long 。int 和long 都是关键字。
整数表示
整数(int 类型的文字量)有几种书写形式,程序中的整数一般采用十进制写法。用十进制方式写出的一个整数就是普通数字字符组成的一个连续序列,其中不能有空格、换行或其他字符。C 语言规定十进制表示的数字序列的第一个字符不是0,除非要写的整数本身就是0。下面是一些整数的例子:
123    304    25278    1    0    906
由于长整数是另一个不同类型,C 语言为长整数规定了一种专门写法,其特殊之处是在表示数值的数字序列最后附一个字母l 或L 作后缀。由于小写字母l 容易与数字1混淆,建议读者总采用大写的L 。下面是一些长整数的例子:
123L    304l    25278L    1l    0L    906L
表示范围
C 语言没有规定各种整数类型的表示范围,也就是说,没有规定各种整数的二进制编码长度。对于int 和long ,只规定了long 类型的表示范围不小于int ,但也允许它们表示范围相同。具体C 语言系统则会对整型和长整型规定明确表示方式和表示范围。例如,早期微型机的一些C 系统采用16位二进制表示的整数(一个int 占2个字节)和32位表示的长整数(一个long 占4个字节)。这样,整型的表示范围就是-32768到32767,即−−2211515L 。长整型表示范围是−−2213131L 。在许多新的微机C 语言系统里,整数(int )和长整数(long int )都采用32位的二进制数表示。
C 语言允许在整数的前面写正负号,加上负号的整数就是表示负整数。
整数的八进制书写法和十六进制书写法
整数与长整数都可以采用八进制或十六进制的形式书写。
用八进制形式写出的整数(int 类型的文字量)是由数字0开始的连续数字序列,在序列中只允许0~7这八个数字。下面是用八进制写法写出的一些整数和长整数:
0236  0527  06254  0531  *******L
整数的十六进制形式是由0x 或0X 开头的数字序列。由于数字只有10个,而在十六进制写法中需要16个数字,C 语言采用计算机领域通行的方式,用字母a ~f 或A ~F 表示其余的6个十六进制数字,其对应关系是:
字母: a,A b,B c,C d,D E,E f,F
表示的数字: 101112131415
下面是用十六进制形式写出的一些整数和长整数:
0x2073  0xA3B5  0XABCD    0XFFFF    0XF0F00000L
请注意:八进制、十进制和十六进制只是整数的不同书写形式,提供多种写法是为了编程方便,使人可以根据需要选择适用的书写方式。无论采用八进制写法还是十六进制写法,写出的仍是某个整数类型的数,并不是新的类型。用八进制、十六进制形式写长整数时,同样需要用后缀l 或者L 。
日常生活中人们习惯于用十进制的形式书写整数。C 语言提供八进制和十六进制的整数书写方式,也是为了写程序的需要。在写复杂程序时,有些情况下用八进制和十六进制更方便些,后面会看到这方面例子。
2.3.2 实数类型和实数的表示
实数类型
C 语言提供了三个表示实数的类型:单精度浮点数类型,简称浮点类型,类型名为 float ;双精度浮点数类型,简称双精度类型,类型名为double ;长双精度类型,类型名为long double 。这些类型的文字量也分别称作“浮点数”、“双精度数”和“长双精度数”。所有整数类型和实数类型统称为算术类型。
实数的计算机内部表示由具体系统规定,其中不少系统采用通行的国际标准(IEEE 标准,IEEE 是电子电器工程师协会,是一个著名的国际性技术组织):
1. 浮点类型的数用4个字节32位二进制表示。这样表示的数大约有7位十进制有效数字,
数值的表示范围约为±××−(..)3410
34103838L ; 2.
双精度类型的数用8个字节64位二进制表示,双精度数大约有16位十进制有效数字,数值的表示范围约为±××−(..)17101710308308L ; 3. 长双精度类型的数用10个字节80位二进制表示,大约有19位十进制有效数字,其数
值的表示范围约为±××−(..)1210121049324932L 。
显然,每个实数类型能表示的数也只是数学中实数的一个小子集合,不仅表示范围有限,表
union是什么类型
示的精度(数的有效数字位数)也有限,请读者注意这些情况。
实数的写法
C语言中最基本的实数类型是双精度类型。双精度数的书写形式中的基本部分是一个数字序列,在序列
中或者包含了一个表示小数点的圆点“.”(可以是第一个或最后一个字符),或者在表示数值的数字序列后面有一个指数部分。指数部分是以e或E开头的另一(可以包括正负号的)数字序列,指数以10为底,这种形式称为科学记数法。也可以既有小数点,又有指数部分。下面是一些双精度数的例子:
3.2  3.2E-3  2.45e170.038105.4E-1030
4.24E8
下面是其中一些双精度类型类型的文字量(双精度数)与它们所表示的实数的对照表:双精度数所表示的实数值
2E-3 0.002
105.4E-10 0.00000001054
2.45e17 24,5000,0000,0000,0000.0
304.24E8 304,2400,0000.0
浮点数(float)类型数的写法在与双精度数类似,只是在数最后应附后缀字符f或者F。表示长双精度数的后缀是l和L。下面是一些浮点数类型和长双精度类型数的例子:
13.2F    1.7853E-2F    24.68700f    .32F    0.337f
12.869L    3.417E34L    .05L      5.E88L      1.L
负实数同样通过在数前加负号表示。
2.3.3 字符类型和字符的表示
字符类型数据主要用于程序的输入输出。此外,文字处理也是计算机的一个重要应用领域,该应用领域的应用程序必须能使用和处理字符形式的数据。由于大部分程序都需要与人打交道,需要接收人的输入信息(例如人给程序发的命令,或者提供的数据),还需要给人输出信息,因此字符类型的数据在程序中的使用很广泛。
最常用的字符类型的类型名是char。字符类型的数据值包括本计算机所用编码字符集中的所有字符。目前微机和工作站常用ASCII字符集,其中的字符包括所有大小写英文字母、数字、各种标点符号字符,还有一些控制字符,一共128个。扩展的ASCII字符集包括256个字符。字符集的所有字符都是字符类型的值。在程序执行时,其中的字符就用对应的编码表示,一个字符通常占用一个字节。
字符文字量的书写形式是用单引号括起的单个字符,例如'1'、'a'、'D'等。一些特殊字符无法用这样写出,例如换行字符等。C语言为它们规定了特殊写法。下面是几个最常用的特殊字符的写法:
换行字符'\n'双引号字符'\"'
单引号字符'\''反斜线字符'\\'
这里的写法都是在单引号里面先写一个反斜线字符(\),后面再写一个字符。在这种写法中,反斜线字符的作用就是表明它后面的字符不取原来意义。这样连续的两个字符(或更多几个字符)称为一个换意序列,用于表示无法写出的字符。反斜线字符在其中起着特殊作用,它也被称为换意字符。还有些特殊字符也有特别规定的写法,附录B列出了所有特殊字符的写法,还说明了采用八进制和十六进制编码形式写字符的方式。
这里需要强调两点。
1. 字符数据与标识符不同。例如x和'x'是两种完全不同的东西,后者表示一个数据项,
是程序处理的对象;前者则是程序描述中所用的一个名字,它可能代表程序里的某个东

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。