所属类别:开发技术
文章作者:恒逸
特别推荐:免费发布信息 承包关键词~~抢爆了!HOT!
储存数据:变量、常量 电脑程序通常会处理各种不同的数据类型,并且需要一种储存数据值的方式。这些数值可以是数字或字条。C语言有两种保存数值的方式―变量和常量―并且每种方式都有许多选项。一个变量是一个存有数值并在程序执行过程中可改变数值的储存单元。相反,一个常量有一个固定的不可改变的值。今天,你将学习:怎样在C语言中创建变量名称不同类型的数值变量的使用方法数值与字符值的相同处和不同处怎样申明和初始化数值变量C语言的两种数值变量在开始对变量的学习之前,你需要知道一些关于电脑内存的操作知识。电脑内存 如果你已经知道电脑内存的操作,你可以跳过这小节。如果你还不太熟悉,继续阅读。这些将帮助你对C编程语言有个确切的认识。 在电脑操作过程中,电脑使用随机储存内存(RAM)来储存信息。RAM由一些集成电路和一些芯片组成,它被安置于电脑主机中。RAM是可擦写的,也就是说,你多次可以清除并写入新的信息。可擦写也意味着内存只有在电脑开启状态可用,当关掉电脑后,上面的信息将全部消失。 每个电脑都有安装有特定容量的RAM。RAM的容量以千字节(KB)或兆字节(MB)为单位,比如512KB,640KB,2MB,4MB或8MB。一个千字节的内存由1,024个字节构成,一个640KB的内存实际上有640*1,024即65,536个字节。一个兆字节由1,024个千字节构成,一个具有4MB的内存有4,098个千字节或者4,194,304个字节。 字节是电脑内存数据储存的基本单元。在第20天的学习“位运算”中有更多关于字节知识。现在,为了让你对特定数据所占字节数有个认识,请看图表3.1图表 3.1. 储存数据所占内存空间.数据类型所需字节字符 x1数字 5002数字 241.1054短语 Teach Yourself C17一篇文章大约 3,000 RAM中的储存空间按顺序排列,一个字节接着另一个字节。每个内存字节都有一个单独的地址,通过它识别内存空间。地址也是区分不同字节的方式。地址根据内存按顺序标志,从0开始,逐个增加到内存的容量。 电脑的内存有哪些用处?内存有很多用处,但对程序员来说,只须关注它的数据储存。数据是C程序处理的信息。不论你的程序是用来建立地址列表,监视股票市场,维持家庭的开销或者记录猪肚子的价格,这些信息(姓名,股票价格,支付费用或者猪肚子的特征)都在程序运行过程中保存在电脑RAM中。既然你已经知道了内存的基本细节,你可以返回对C语言对内存的使用和对C语言编程的学习了。变量 变量是电脑系统内存储存位置的名称。在程序中使用变量名,实际使用的是储存于其中的数据。变量名 在程序中使用变量之前,你得知道怎样创建变量名。在C语言中,变量名必须符合下列规则:变量名必须包含字母、数字和下划线(_)。 第一个字符必须是字母或者下划线,但不建议使用下划线。区分字母大小写,即,变量名count和Count是两个不同的变量名。C语言的关键字不能被用作变量名。关键字是C语言的一部分(在附录B“保留字”中有33个C语言关键字的列表) 下表是个包含合法和非法变量名的例子:变量名合法性Percent合法y2x5__fg7h合法annual_profit合法_1990_tax合法但不建议savings#account不合法:包含非法字符 #double不合法:c语言的关键字9winter不合法:第一个字符是数字 因为C语言区分大小写,percent,PERCENT和Percent这三个字句被认为是三个不同的变量。C程序员通使用小写字母作为变量名,仅管这并不是必须的。通常是使用全大写字母来给常量(在本章后面讨论)命名。 对许多编译器,一个C语言的变量名可以长达31个字符(实际可超过,但编译器只识别前31个字符)。由于这个灵活性,你可以创建能够反映储存数据性质的变量名。比如一个计算贷款金额的程序,可以用interest_rate的变量名来储存最初利息税率的数据。这样的变量名使其使用时更清晰。同样你也可以使用x或johnny_carson为变量名,这对编译器来说都是一样的。但这样的使用方法会让其它看源代码的人感到难以理解。仅管创建描述性的变量名会花费更多时间,但它对程序清晰上的改善让这些时间很值。 许多创建变量名的命名规则是使用多字名称。你已经看到了一个例子:interest_rate。使用下划线来分开单词使它更容易理解。第二种方法叫作大写标志法 ,不使用间隔,而是让每个单词的第一个字母大写。即使用变量名InterestRate来代替interest_rate。大写标志变得更流行,因为输入大写字母比输入下划线更容易。我们在这本书中使用下划线是为让大多数人都容易理解。你应该选择个适合自己的方法。最好使用描述性的变量名称最好形成并严格使用适合自己的变量命名特色不要以下划线作为你变量名的第一个字符不要使用全为大写字母的变量名数值变量类型 C语言提供了几种不同的数字变量类型。因为不同的数字值需要不同的储存空间并且在对它进行数值运算的时候有不同的难易程度要求,所以你需要不同种类的数字变量。小的整型(比如1,199和-8)需要少量的储存空间并且电脑对它进行数值运算(加,减,乘,除等)时非常快。相反,大的整型数字和浮点数字(比如123,000,000或0.0000000871256)在运算时需要更多的储存空间和更多的时间。使用正确的变量类型,会让你的程序尽可能的高效运行。 C语言的数字变量分为下列两大类:不含小数的整型数据(即只有数字)。整型变量又分为两个类别:包含正数和负数的有符号整型变量,和只有正数(包括0)的无符号整型变量。浮点变量包含小数部分(即实数) 在这两大类中又分为两个或更多的单独类型。在表3.2中有个对数值变量的总结,同时也以字节为单位显示了16位计算机中保存这些不同种类的数据需要的内存量。图表 3.2. C语言的数值变量类型.变量类型关键字需要字节数范围字母char1-128 to 127整型int2-32768 to 32767短整型short2-32768 to 32767长整型long4-2,147,483,648 to 2,147,438,647无符号字符unsigned char10 to 255无符号整型unsigned int20 to 65535无符号短整型unsigned short20 to 65535无符号长整型unsigned long40 to 4,294,967,295单精度浮点型float41.2E-38 to3.4E381双精度浮点型double82.2E-308 to1.8E30821大致范围; 7位精确度.2大致范围;19位精确度.大致范围 即一个给定变量能够保存的最大和最小值。(内存空间的限制影响了列表中的变量值范围值。)精确度即变量储存的准确值(比如,在计算1/3时,结果是0.3333……3的无限循环。精确度为7的变量将储存7个3) 仔细看图表3.2,你可能会注意到整型和短整型是相同的两个变量类型。为什么需要这两个相同类型?在16位IBM个人计算机中,整型和短整型的确是相同的,但在其它类型的硬件上,它们是不同的。在VAX系统中,一个短整型和一个整型就是不同大小的,一个短整型是两个字节,而整型是四个字节。记住,C语言是个灵活,可移性语言,所以它对这两种类型提供了两个不同的关键字。如果你使用的是个人电脑,你可互换使用整型和短整型。 对于整型变量不需要标志特殊的关键字;整型变量被标志为默认。然而,只要你愿意,你也可以用关键字对其标志。图表3.2中显示的关键字是变量的修饰词,这将在接下来的小节中进行讨论。实例3.1将帮助你获知你自己系统的变量大小。如果你电脑的输出与列表后面的结果不同,不要感到惊讶。实例3.1. 一个显示C语言不同变量大小的程序.1:
/* SIZEOF.C―以字节方式告诉你C语言变量大小的程序 */2: 3:4:
#include 5:6:
main()7:
{8:9:
printf( "\nA char
is %d bytes", sizeof( char ));10:
printf( "\nAn int
is %d bytes", sizeof( int ));11:
printf( "\nA short
is %d bytes", sizeof( short ));12:
printf( "\nA long
is %d bytes", sizeof( long ));13:
printf( "\nAn unsigned char
is %d bytes", sizeof( unsigned char ));14:
printf( "\nAn unsigned int
is %d bytes", sizeof( unsigned int ));15:
printf( "\nAn unsigned short is %d bytes", sizeof( unsigned short ));16:
printf( "\nAn unsigned long
is %d bytes", sizeof( unsigned long ));17:
printf( "\nA float
is %d bytes", sizeof( float ));18:
printf( "\nA double
is %d bytes\n", sizeof( double ));19:20:
return 0;21:
}A char
is 1 bytesAn int
is 2 bytesA short
is 2 bytesA long
is 4 bytesAn unsigned char
is 1 bytesAn unsigned int
is 2 bytesAn unsigned short is 2 bytesAn unsigned long
is 4 bytesA float
is 4 bytesA double
is 8 bytes分析:正如上面结果显示,实例3.1告诉你在你的电脑上,每个变量占用空间的具体字节数。如果你使用的是16位个人电脑,你的输出结果应该与图表3.2一致。不要对于不能理解这个程序中的每个组件感到担心。仅管一些术语是新的,比如sizeof(),但大多数都是熟悉的。第1行注释是程序关于程序名称以及对其的简介;第4行包含标准输入输出的头文件,这样,可以在电脑屏幕上显示信息。这是一个简单的程序,它只有主函数(7至21行)一个函数。第9至18行是程序的主要部分。每一行都打印对每个变量类型大小的文本描述,变量的大小由sizeof()这个函数获取。第19天的学习“探索C语言库函数”,将对sizeof()这个函数进行详解。第20行是在程序结束前返回个值0给操作系统。 仅管不同数据类型所占的内存大小根据你使用的电脑平台不同而不同,但C语言采取了多种措施来保证其可移性,这得感谢ANSI标准。你可以明确知道这五点:字符只占一个字节短整型数据的大小小于或等于整型数据整型数据的大小小于或等于长整型数据无符号整型的大小与整型相同浮点型数据的大小小于或等于双精度型变量申明 C程序在使用变量之前必须对变量进行定义,变量的定义告诉编译器,变量名和变量类型以及对变量值的初始化(可选 )如果你的程序使用了一个没经申明的变量,编译器将产生条出错信息。使用下面的方式来对变量进行定义:Typename类型名 varname变量名;Typename类型名必须是图表3.2中的一个关键字以标志变量的类型。变量名是变量的名字,在前面已经介绍过其命名规则。你可以在一行中定义同一个类型的多个变量,仅仅只须将多个变量名用逗号隔开:int count, number, start;
/* 三个整型变量 */float percent, total;
/* 两个浮点变量 */在第12天“变量作用范围”的学习中,你将知道,源代码中变量定义的位置非常重要,因为它影响到,你的程序将以什么样的方式来使用这些变量。现在,你可以将所有变量的定义全放在main()函数之前。关键字typedefTypedef这个关键字用来创建已存在数据类型的新名称实际上,typeef创建了个同义词。比如这条语句typedef int integer;创建了integer这个int的同义词。你可以像下边例子一样使用integer来定义整型变量类型:integer count;注意typedef并不是创建了一个新的数据类型,它只是让你对已定义类型使用一个不同的名称。Typedef经常使用于结构体的定义上,结构体将在第11天“结构”中进行学习。一个结构体类型是由这章所讲的数据类型的一个组合。数值变量的初始化 当你定义一个变量的时候,你指导编译器为变量放置了一些储存空间。然而储存于其中的值即变量值并未被定义。它可能是0,也可能是一些其它“垃圾”值。在使用变量之前,你需要为它初始化一个值。你可以像下面的例子一样,使用单独的赋值语句来给变量赋值。int count;
/* 为变量count预置储存空间 */count = 0;
/* 给变量count赋值0 */注意,这条语句使用了等号(=),等号是C语言里的赋值符,这些将在第4天“语句,表达式,操作符”中进行讲解。现在你需要知道,C语言中的等号与代数中的等号不同。如果你在代数中写x=12,意味着“x等于12”。但在C语言中,它的意义与此不同,“将12这个值传递给变量x”。你也可以在变量定义的时候使用等号来对变量初始赋值。比如:int count = 0;double percent = 0.01, taxrate = 28.5;在对变量赋值的时候,注意不要超过变量值允许的范围,这里有两个超出范围初始化值的例子:int weight = 100000;unsigned int value = -2500;C编译器不会查出这类错误,你的程序会被编译链接,但你在运行程序的时候会得到意外的结果。最好知道每个变量类型占你系统内存的字节数最好使用typedef语句让你的程序更易于阅读。最好在你对变量进行定义的时候就对它初始赋值。不要使用未初始化数值的变量,其结果将不可预料。不要使用浮点或双精度浮点变量来储存整型数据,仅管它们会起作用,但那样是低效的不要将长的数字储存于包含数字很小的变量类型里不要将负数储存于无符号变量中 常量 与变量一样,常量是程序中的数据储存空间。与变量不一样的是,在程序执行过程中,储存于常量的数据不能被改变。C语言有两种不同的常量每一种都有它独特的用法。字面常量字面常量 是一个需要时在源代码中输入并可立即被使用的值。这里有两个例子:int count = 20;float tax_rate = 0.28; 20和0.28就是字面常量。在前面的语句中将这两个值分别储存于变量count和tax_rate中。注意有个字面常量包含了个小数点,而另一个却没有。有没有小数点是区分浮点字面常量和整型字面常量的依据。 一个有小数点的字面常量在C编译器中以双精度小数表示。浮点常量可以像下面例子一样,被写为标准的小数形式。123.4560.019100.注意第三个常量100.,即使它是个整数,但其后面有个小数点(但没有小数部分)。这个小数点全C编译器将其当作是双精度浮点常量处理,如果没有小数点,它将被当作整型常量 浮点常量也可以用科学记数法来表示。你应该能够回想起高中数学用小数部分乘以10的正N次方或负N次方的科学记数法来表示一个数。科学记数法对于表示特别小和特别大的数字非常有用。在C语言中,科学记数法以小数部份紧跟E或e来表示,下面是例子:1.23E2 表示1.23乘以10的2次方,即1234.08e6 表示4.08乘以10的6次方,即4,080,0000.85e-4 表示0.85乘以10的-4次方,即0.000085 没有小数点的常量在编译器中是以整数形式来保存。整数常量有三种记数方式:以非0数字开头的数字常量是十进制数(即,以10为基数的数字系统)。十进制数包含了从0到9的数字以及正负号(没有正负号时,常量被默认为是正数)。 以数字0开头的常量是八进制数(以8为基数的数字系统)。八进制常数包含了0到7的数字以及正负号。以0x或0X开头的常量是十六进制常数(以16为基数的数字系统)。十六进制包含了从0到9的数字和从A到F的字母,并且在前面有正负号。 注意:在附录C“使用二进制和十六进制数字”里有更为全面的十进制和十六进制的介绍定义常量 定义常量是在程序中用名字(字符)来代表常量。与字面常量一样,字面常量不能改变它的值。在程序你需要使用常量值的时候就像使用变量一样只须要使用它的名字。定义常量的值,只需要在定义的时候输入一次。 如下面的例子显示,定义常量有两个显著优势强于数值变量。假设你在编写一个计算几何问题的系列软件。这个程序在其计算中需要p(3.14159)这个数值(你可能回想起几何学中,p是通过直径计算圆周长的比率)。比如,在计算未知半径大小的圆周长及贺面积的时候,你可能会写为:circumference = 3.14159 * (2 * radius);area = 3.14159 * (radius)*(radius); 星号是(*)是C语言里的乘积运算符,这将在第4天的学习中讲解。因此,第一条语句的意思是“用变量radius乘以2再将结果与3.14159相乘,最终将结果赋给变量circumference”。 假如你定义一个名为PI值为3.14的字符变量,你可以写为circumference = PI * (2 * radius);area = PI * (radius)*(radius);这样的代码更为清晰。你可以立即看出正在使用的常量PI代替了令人厌烦的3.14159这个值。 在你需要对常量进行修改的时候,定义常量的第二个优点就显现出来了。继续前面的例子,你可能会为了更为精确计算而用位数更多的3.14159来代替3.14.如果你使用的是字面常量,你将对源代码进行通篇更改,而使用定义常量,你只需要在它定义的地方做出修改即可。 C语言有两种定义定义常量的方式:#define指令和常量关键字。#define指令是C语言预处理指令的一种,它将在第21天“编译器的应用”中做完全讲解。下面是#define指令的例子:#define CONSTNAME literal这条语句创建了个名为CONSTNAME、值为literal的定义常量。literal是个字面常量,这在前面已做过说明。定义常量的命名与变量的命名相同,只是约定常量全用大写字母,而变量为小写字母。这使得区分变量和常量变得容易。那么前面的那个例子应该为#define PI 3.14159。注意#define语句行不以冒号(;)结束。#define语句可以放在源代码的任意位置,但它的作用域在#define语句下面。大多数情况下,程序员将所有的#define语句一起放置于main函数之前、源代码文件开头。#define语句是怎样起作用的 #define语句指导编译器准确地做下面的动作:“在源代码中,用literal代替CONSTNAME。”这与你亲自使用编辑器去查找整篇源代码而做更改的效果是一样的。注意#define语句不会替换目标代码中的一些相同字,比如:包含它但比它长的名称,双引号中的以及注释部份。比如,下面的代码中,第2行和3行中的PI不会被替换。 #define#define PI 3.14159/* You have defined a constant for PI. */#define PIPETTE 100使用常量关键字来定义常量 定义字符变量的第二种方法是使用常量关键字。const是个可用在所有变量类型前的修饰符。变量不能在程序执行过程中被定义为常量―只能在初始化时候定义。下面是一些例子:const int count = 100;const float pi = 3.14159;const long debt = 12000000, float tax_rate = 0.21;const这个关键字影响了定义行中的所有变量。在最后一行中,debt和tax_rate是字符变量。如果你的程序试着去修改常量,编译器将产生如下错误信息:const int count = 100;count = 200;
/* Does not compile! Cannot reassign or alter */
/* the value of a constant. */使用#define定义定义常量与使用常量关键字定义常量有什么本质区别?这些区别与指针和变量范围有关。指针和变量范围是C编程里两个非常重要的章节。它们交在第9天“理解指针”和第12天中进行讨论。让我们来看看关注于变量修饰以及对数值变量和字符变量的使用的程序。实例3.2提示使用者输入他或她的体重和年龄。之后程序将用千克表示使用者的体重并计算使用者在2000年的年龄。你可以使用第一天讨论的“开始学习C”中的步骤来输入、编译以及运行这个程序。实例 3.2. 变量和常量使用方法的实例.1:
/* 变量和常量 */2:
#include 3:4:
/* 定义一个将磅转化为千克的常量 */5:
#define GRAMS_PER_POUND 4546:7:
/* 定义下世纪开始的年份的一个常量 */8:
const int NEXT_CENTURY = 2000;9:10:
/* 申明将使用的变量 */11:
long weight_in_grams, weight_in_pounds;12
int year_of_birth, age_in_2000;13:14:
main()15:
{16:
/* 用户输入数据 */17:18:
printf("Enter your weight in pounds: ");19:
scanf("%d", &weight_in_pounds);20:
printf("Enter your year of birth: ");21:
scanf("%d", &year_of_birth);22:23:
/* 执行转换 */24:25:
weight_in_grams = weight_in_pounds * GRAMS_PER_POUND;26:
age_in_2000 = NEXT_CENTURY - year_of_birth;27:28:
/* 在屏幕上显示结果 */29:30:
printf("\nYour weight in grams = %ld", weight_in_grams);31:
printf("\nIn 2000 you will be %d years old\n", age_in_2000);32:33:
return 0;34:
}Enter your weight in pounds: 175Enter your year of birth: 1960Your weight in grams = 79450In 2000 you will be 40 years old分析:这个程序在第5行和第8行申明了两种类型的字符变量。在第5行使用了GRAMS_PER_POUND作为变量名,这使得数值454更容易理解,也使25行的程序段显得简单易懂。在11和和12行申明了程序里的变量。注意变量的描述性的名字,比如weight_in_grams,这样,你能清楚明白变量的含义。18和20行将程序的结果显示于屏幕上。函数printf()的功能将在日后做详细介绍。Scanf()的功能是从键盘获取信息,它也将在日后做详细介绍。现在只需知道实例中的功能。日后你将很详尽的知道它们是怎样起作用的。25和26行计算使用者的体重以及他或她在公元2000时的年龄。这样语句段都将在下一章做详尽讲解。在30和31行展示了最后结果,以此结束程序。最好 .使用常量让你的程序更容易阅读不要 试着给已经定义的常量赋值.总结 这章讲述了C语言程序执行过程中储存数据的数值变量。你已经知道有了两类数值变量,整数和浮点数。在每一类中都有几种独特的变量类型,即:整形,长整形以及双精度型――根据数据的性质将它们储存于不同类型的变量中。同时你也知道在变量使用前你必须对它进行申明。一个变量的申明由变量名和变量类型构成。 同时这章也讲解了c语言的两种常量类型,字面常量和定义常量。与变量不同,常量在程序执行过程中不能改变。在对数值有需求的程序段中你可以输入字面常量,而你可以在需要使用常量时使用定义常量名。定义常量于#define指令进行定义或使用常量关键字。Q&AQ 长整形变量能储存更多的数据,为什么不总是使用它来代替整形变量? A 长整形变量比整形占用更多内存。在小的程序里,这并不是个大问题,随着程序变得更大,此时你得尝试着高效利用内存。Q 如果用小数给整形数据赋值会出现什么样的问题? .你可以用小数给整形变量赋值,如果你使用一个固定变量,你的编译器会给你一个警告。变量只会包含整数部分的值。比如,如果你将3.14赋值给变量pi,pi将只包含3。小数部分(3.14)将被省去。Q 如果把个数字赋给一个数值范围不够大的变量类型,将发生什么?许多编译器请允许这种做法,并且没有错误提示。这样的数据将被存储,但它并不是正确的。比如,如果你将32768赋给一个两字节的有符号的整数变量,这个变量实际储存的值为-32768,如果你将65535赋给这个变量,它实际储存的值为-1.实际的储存值为减去这个变量能包含的最大值后的数值。Q假如将一个负值赋给一个无符号变量,将会发生什么?A 与前面所讲一致,你的编译器不会提示任何错误信息。编译器与你将过大的数据储存于一个整形数据时做出的反应一样。比如,如果你将-1赋给了一个两字节的无符号整形变量,编译器最终会储存这个最大的数值(65535)。Q使用#define指令创建的常量与使用常量关键字创建的常量有什么实质上的区别? A 不同在于指针和变量范围。指令和变量范围是C语言中两个非常重要的概念,将在第九天和第十二天讲解。现在,只须知道使用#define指令创建常量,可以让你的程序可读性更强。练习小测试1.整形变量与浮点变量的区别是什么? 2.给出使用双精度浮点变量而不使用单精度浮点变量的两个理由。3. 在给变量分配空间时,为遵守ANSI标准需要注意的五条规则是什么?4. 使用定义常量代替字面常量的两个好处是什么?5.用两种方法来定义值为100的常量MAXIMUM.6.在C语言变量名中,哪些字符是合法的? 7. 你在为变量和常量赋与名称的时候需要遵守哪些规则?8. 字面常量与定义常量有哪些不同?9. 整形变量能够包含的最小值是多少?练习1.你将使用哪些变量来储存下列数据?a. 今年某人的年龄b.用磅表示某人体重c. 圆的半径d. 你的年薪e. 物体的价格f. 测试成绩的最高分(假设满分为100)g.温度 h. 某人的净资产i. 用英里表示的到达某星的距离2.为练习1中的变量赋与恰当的变量名3..定义练习2 中的变量 4.下面哪些变量名是合法的? a. 123variableb. xc. total_scored. Weight_in_#se. one.0f. gross-costg. RADIUSh. Radiusi. radiusj. this_is_a_variable_to_hold_the_width_of_a_box本文出自 51CTO.COM技术博客
相关信息· 用python实现面向对像的ASP程序
· LINUX入门
· 1栏分页显示(附显示的形式[1][2]),此程序可直接套用
· 框架,设计模式,软件应用
115137
74738
