C Primer Plus. Fifth Edition 翻译Chapter 3 数据和C (Data and C)第一部分

来源:互联网 发布:服装进出口数据 编辑:程序博客网 时间:2024/04/28 16:03

C Primer Plus. Fifth Edition 翻译Chapter 2 数据和C (Data and C)

在这章你将学到以下几点:

     关键词:

              int, short, long, unsigned, char, float, double, _Bool, _Complex, _Imaginary

     操作符

              sizeof

     函数

              Scanf()

     C使用的基本数据类型

     整型和浮点型之间的区别

     写这些类型的常量和声明变量

     如何使用printf( )scanf( )函数去读写不同类型的变量

 

程序通过数据进行工作。你输入数字,字母和词到计算机,你也期望它能通过这些数据做些什么事情。比如,你希望计算机能计算一份感兴趣的账单,或者显示一份排列好的关于佳酿的单子。在这章,你将不仅能练习读取数据,也能有机会练习如何维护数据,这将会很有趣。

这章提供了两类数据类型:整型和浮点型。C提供了几种这样的类型。在这章会告诉你类型是什么,如何声明它们,以及如何在和何时使用它们。而且,你也将发现常量和变量之间的不同,作为一种激励,你也会首次短暂的接触到交互式程序。

 

3.1 一个样本程序

 

再一次你将开始于一个样本程序。正如前面的,当你觉得有什么不明白的地方,我们会很快把它解释清楚。这个程序的一般意图应该很清楚,所以尝试着去编译和运行例3.1所示的源代码(译者:这里我推荐使用Dev-C++google搜下就能找到)。为了节省时间,你也可以省去注释部分。(译者:但是我不推荐省去注释,注释是一种很好的习惯,所以,要养成这种习惯)

3.1 rhodium.c程序

/* rhodium.c  -- your weight in rhodium        */
#include <stdio.h>
 
int main(void)
{
    float weight;    /* user weight            */
    float value;     /* rhodium equivalent     */
 
    printf("Are you worth your weight in rhodium?/n");
    printf("Let's check it out./n");
    printf("Please enter your weight in pounds: ");
/* get input from the user                     */
    scanf("%f", &weight);
/* assume rhodium is $770 per ounce            */
/* 14.5833 converts pounds avd. to ounces troy */
    value = 770.0 * weight * 14.5833;
    printf("Your weight in rhodium is worth $%.2f./n", value);
    printf("You are easily worth that! If rhodium prices drop,/n");
    printf("eat more to maintain your value./n");
    getch();                  /*译者加,便于调试显示*/
 
    return 0;
}

*errorswarnings

如果你在打这个程序的时候,发生了错误,比如,漏掉了一个分号,编译器会给你一个语法错误信息。甚至你正确的输入了这个程序,编译器也可能给你一个警告的信息,类似于"Warning—conversion from 'double' to 'float,' possible loss of data."error的信息意味着你做错了什么,将阻止程序被编译。而一个warning,则意味着你做的是一个合法的代码,但是可能执行的不是你的意思所表达的。Warning不会停止编译。这个特定的warning将允许C如何取比如770.0这样的值。对于上面这个例子,这不会是一个问题,本章也会在后面解释这个warning

 

当你输入完这个程序,你可能想改变770.0或者14.5833,你可以改变770.0,如果这个值在实际中是变化的话,但是对于一般保持不变的,如14.5833,你尽量不要去改变。(译者:此处有点难翻译。我想,作者的意思就是改变所能改变的,不变所不能变的)

运行后,会提示你"Please enter your weight in pounds: ",这意味着你需要输入你的体重和一个回车键,按回车键是为了告诉计算机你已经输入完毕。这个程序希望你输入一个数字,比如150,而不是一个单词,比如“too much”。输入了字母而不是数字将会引起错误,这时候需要一个if语句来解决。(在第7章“C控制语句:分支和跳转C Control Statements: Branching and Jumps”)所以请在这里有礼貌的(笑)输入一个数字。这里是一个样本输出结果

Are you worth your weight in rhodium?
Let's check it out.
Please enter your weight in pounds: 150
Your weight in rhodium is worth $1684371.12.
You are easily worth that! If rhodium prices drop,
eat more to maintain your value.
在这个程序中有一些新的元素:
    注意到这里使用了一种新的变量声明。以前的例子都只是使用到了一个整型变量(int),但在这里加入了一个浮点型变量(float)。所以你能控制一个更宽种类的数据。浮点型数据能是一个带小数点的数字。
    这个程序给了写常量的几种新的方法。现在你有了带小数点的数字。
    为了打印这种新的变量,在printf()代码中使用了%f来区别控制一个浮点型变量。使用.2来控制%f更精确的输出,小数点后带两位。
    为了提供键盘输入到程序中,使用了scanf()函数。%f提示scanf()将从键盘读入一个浮点型数字,&weight告诉scanf()输入的数字将赋值给变量weightScanf()函数使用&引用符告诉在哪个地方能找到weight这个变量(译者:也就是weight这个变量在计算机中存放的位置)。下一章将进一步讨论&,在这里相信我们,要使用它(笑)。
    可能这里最引人的新的特征就是这个程序是交互性的(人机交互笑)。计算机将告诉你需要什么信息,然后使用你提供的数字。一个交互性的程序将比使用一个非交互性的会有趣很多。更重要一点,交互性方法使程序有了更多的柔性。比如,样本程序能使用任一的合理的体重数据,而不仅仅是150磅。你也不必每次遇到一个新的人而重写你的程序。Scanf()printf()函数是交互性变得可能。Scanf()函数从键盘读取数据,传送到程序中,printf从程序中读取数据在你的显示屏上进行显示。合起来,这两个函数使你能和计算机之间建立一个双向的交流关系。看figure3.1,这也使得使用计算机更有乐趣。
                              
Figure3.1 工作中的scanf()printf()函数
本章将解释上面所列的前面两个新的特征:不同数据类型的变量和常量。在第四章“字符串和格式化输入输出”中将覆盖后面三点,但这章将会继续使用scanf()printf().
 
 

3.2 数据变量和常量

 

计算机在程序的引导下,将会做很多事情。它能对数字相加,排列名字,控制扬声器或者音响的声音,计算彗星轨道,准备邮件列表,拨打电话,画直方图,得出结论或者任何你所能想象到的事情。为了做这些事情,程序需要数据data,数字,字符来承载你所使用的信息。有些数据类型在程序适用前预设,并且在程序执行过程中不会被改变,这就是常量constants.另一些则会在程序的运行中被赋予不同的值,这就是变量variables.在样本程序中,weight就是一个变量。而14.5833就是一个常量。那对于770.0呢,确实,在真实的程序生命周期中,the price of rhodium不是一个常量,但在这个程序中我们把它作为一个常量。变量和常量间的区别就是一个可以变量能被赋予值并能在程序运行时进行改变,而一个常量则不能。

 

3.3数据:数据类型关键字

 

除了要区分变量和常量,数据的类型也要被区分。一些数据类型是数字,一些是字母,或更通用的,是字符。计算机需要一种方法来区分和使用这些不同的类型。C通过区分几类基本的数据类型来做到。如果一个数据是常量,编译器通常就能根据它所显示的而得知为什么类型,如42就是一个整型量,42.100则是一个浮点型量。然而,一个变量,需要使用声明语句来宣布它的类型。如果你继续看下去,你将学会声明变量的细节。首先,我们来看下C能辨认的基本类型。K&R C能辨认7种类型关键字。C90标准多了两种, C99则又加了3种,如表3.1所示。

Table 3.1. C Data Keywords

Original K&R Keywords

C90 Keywords

C99 Keywords

int

signed

_Bool

long

void

_Complex

short

 

_Imaginary

unsigned

 

 

char

 

 

float

 

 

double

 

 

_Bool 类型是布尔量 (true and false),  _Complex _Imaginary 分别代表复数和虚数。字符char也可以表示小整数。

由上面关键字创建的类型在计算机上的存贮分为两个基本类型:整型和浮点型。

*bits,字节bits,words

最小的存贮单位是位bit,它能保持两种值:0或者1。(或者是off,on)在一个位上你不能存储更多的信息,但计算机上有非常多的位。位也是构成计算机内存的基本单位。

字节byte是计算机内存的通常单位。对几乎所有的机器来说,一个字节就是八位,这也是标准的定义,至少当被用来计算存贮量的时候。(然后,在C语言中,将会有不同的定义,正如在后面使用字符,char类型这部分时所讨论的)。对于一个8位的字节来说,总共有256种可能(28次方)。当被使用时,举个例子,可以用于代表0-255,或者代表一个字符集。

一个字是对于给定的计算机设计,是内存的自然单位,比如对于8位微计算机(如51单片机),一个字就是8位。8028616位机器,一个字就是16位。现在的计算机已经有64位或者更多。

 

整型与浮点型

对于人,两者的区别在于他们的书写方式不同,而对于计算机,他们的区别则在于他们的存贮方式不同。

整型

C中,整型就是没有小数点的数字,比如2-232456。数字也可以是3.140.22,但他们不是整型。整型以二进制存贮,比如整型量7,用二进制量111表示。因此,为了在一个8位字节中存贮这个变量,就要设定前面5位为0,而后3位为1。见图3.2

Figure3.2 在一个二进制代码中存贮整型7

浮点型数字

浮点型数字或多或少和数学上的实数很类似。实数包括了整型数字和一些浮点型数字如3.753.16E7,7.00,2e-8。要注意到加了个小数点,将会使值转化为一个浮点型值。所以7是一个整型值,而7.00则是一个浮点型。书写浮点型不止一种方法,比如e的使用。

关键点是浮点型和整型的存贮是不同的。浮点型需要分别存贮数字和指数部分。所以7.007存贮的方法将不一样,尽管两者拥有相同的值。在这里,7.00将被写为0.7E10.7fractional部分,1exponent指数部分。图3.3举了一个存贮浮点型的例子。当然计算机在内部存贮中将使用二进制数字和2的乘方代替来代替10的乘方。在第15章中你会找到关于这方面更多的内容。现在,让我们来集中于两者的差别上:

     整型没有fractional部分,浮点型数字则有一个fractional部分。(译者,fractional不知道翻译为什么)

     浮点型数字将比整型数字表示的范围要更大,可以看表3.3

     对某些算术操作符,比如从一个大数减去另一个,浮点型在精度上更可能损失更多。

     由于实数在某个范围上的连续性,比如在1.02.0范围间,计算机浮点型数字不能代表这个范围内所有的数字。因此,浮点型值经常是一个近似于真实值的数值。比如,7.0可能被6.99999这个浮点型值存贮。

     浮点型操作通常要比整型操作慢。但是,微处理器的发展使得现在使用浮点型操作很有效,两者之间的差距已经很接近。

3.3 以浮点型存贮数字pi(十进制)

 
原创粉丝点击