1
C/C ++程序设计
1.2.2.4 2.4 数据社会

2.4 数据社会

我们看到了C语言中纷繁复杂的数据类型以及与之相应的变量和常量,当然仅凭一章的内容只能是管中窥豹。如果要用一个词来概括的话,应该是———数据社会。

2.4.1 数据的社会性

首先来探讨一下数据的社会性。其实,所有程序的执行过程(当然编写过程亦是如此)都是处理数据的过程,在C语言中,处理的对象就是变量和常量。通过前面的介绍我们不难得出每一个变量和常量都从属于一种数据类型,也就是说在C语言中,变量和常量分成了不同的类别。不但如此,更为重要的是所有的变量和常量都要参与运算,就是说它们都要进行交流,完全是一种关系,如果参照我们人类社会的话,就是数据关系了。正是这种关系,才形成了形形色色的程序。对于每一个程序而言,里面都有不同的变量和常量,它们从属于不同的数据类型,而且要进行各种各样的运算,每一个变量或者常量都要经历从产生到灭亡的历程,都在不同的角色中演绎不同的“人生”。至于这些常量和变量如何被定义和撤销,则是由编程人员来决定的。

这就需要编程人员形成正确的程序开发的思想,具有良好的编程素养,掌握深入的编程知识,利用合理的程序设计方法,导演好每一个程序。

2.4.2 一条铁的准则

正如上一节所说的,数据具有社会性,从社会层面来看,势必有很多的准则需要恪守,随着不断地学习可以逐步地感受和掌握。本节将探讨其中一条铁的准则———不同类型的常量和变量严禁运算。也可以说C语言的“门户之见甚深”。明白了这条准则,让我们头痛无比的类型转化就简单了。

由于我们本章旨在讨论数据类型以及变量和常量,所以不可能通过丰富的例子给大家呈现本条准则。这里旨在说明这一条准则,以期引起大家的注意罢了。

2.4.3 数据的无奈

也许大家会问,如此的铁律,难道就真的隔绝了不同类型的数据交往了么?真的如此,数据岂非无奈的,而且也与现实情况不符。数据确实很无奈,不同类型的变量和常量不能进行运算。我们先看一个例子:

【例2.3】整型数据和浮点数据的运算。

(1)打开Visual C++6.0环境,建立一个控制台工程,其名称为Example_2_3_IntandDouble;

(2)添加C源文件,并编写如下代码:

img33

(3)运行结果如图2-4所示。

img34

图2-4

(4)程序分析

本段程序定义了两个变量,整型的iFirst和浮点型的fSecond,并赋初值为9和9.0,这里一定要注意两者的区别,虽然从纯数学的角度来看,似乎相等,都是9,但是在计算机的存储中差别很大,这个可以从第9行和第10行看出。值得一提的是9和9.0实际上是两个常量,第12行中将整型的iFirst和浮点型的fSecond相加,其和赋给整型变量iSum,结果为18,这个过程计算机可谓大费周折,首先将iFirst转变为double型的变量,然后和double型的变量fSecond相加,其和为double型的值18.000000(计算机表现形式上如此),然后再次将和转变为整型的值赋给整型变量iSum。从中我们可以体会出计算机的严谨,同时也可以看出数据的无奈。大家可以自行分析第13行代码。

通过本例可以看出两点:

(1)数据的运算务必要恪守铁的纪律(不同的数据类型不能运算),这一点在上一节中已经做了详细的说明。

(2)类型转化遵守一定的规律:小数据类型自动转化为大数据类型。注意数据类型本无大小之别,这里用大小描述仅为了说明问题,我们可以简单地认为,所谓“小”是相对于“大”来讲,是指那些存储结构简单一些,数据范围狭窄一些的数据类型。比如这里的整型就是小数据类型,双精度浮点型就是大数据类型。一般的有如下转化顺序:

img35

我们可以进一步思考,如果数据感到无奈时,可以自由选择转化吗?答案是肯定的,这就是强制类型转换,语法如下:

(类型说明符)(表达式)

其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。例如:

(float)a,把a转换为实型。

(int)(x+y),把x+y的结果转换为整型。

在进行强制转换时应注意以下问题:

(1)类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则表示把x转换成int型之后再与y相加。

(2)无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,并不改变数据说明时对该变量定义的类型。