变量 还是从变量讲起来吧。变量(variable)实际上是赋予内存地址的名称。声明变量后,就可以用它操作内存中的数据。下面举几个例子进行说明。下列码段用了两个变量,每条语句末尾用说明语句描述执行该语句时发生的情况: int x;// variable declared as an integer variable x = 100;// 'x' now contains the value 100 x +=50;// 'x' now contains the value 150 int y = 150;// 'y' declared and initialized to 150 x += y;// 'x' now contains the value 300 x++;// 'x' now contains the value 301 新术语 变量(variable)是留作存放某个数值的计算机内存地址。注重x的值在变量操作时会改变,稍后会介绍操作变量的C++操作符。警告 声明而未初始化的变量包含随机值。由于变量所指向的内存还没有初始化,所以不知道该内存地址包含什么值。 例如,下列代码 int k; int y; x=y+10; //oops! 本例中变量y没有事先初始化,所以x可能取得任何值。例外的情况是全局变量和用static修饰声明的变量总是初始化为0。而所有其它变量在初始化或赋值之前包含随机值。变量名可以混合大写、小写字母和数字与下划线(_),但不能包含空格和其它非凡字符。变量名必须以字母或下划线开始。一般来说,变量名以下划线或双下划线开始不好。变量名答应的最大长度随编译器的不同而不同。假如变量名保持在32个字符以下,则绝对安全。实际中,任何超过20个字符的变量名都是不实用的。 下例是有效变量名的例子: int aVeryLongVariableName;// a long variable name int my_variable;// a variable with an underscore int_ x;// OK,but not advisedint X;// uppercase variable name int Labe12;// a variable name containing a number int GetItemsInContainer(); // thanks Pete! 说明 C++中的变量名是考虑大小写的,下列变量是不同的:int XPos;int xpos;假如你原先所用语言不考虑大小写(如Pascal),则开始接触考虑大小写的语言可能不太适应。
C++数据类型 新术语 C++数据类型定义编译器在内存中存放信息的方式。在有些编程语言中,可以向变量赋予任何数值类型。例如,下面是BASIC代码的例子:x = 1;x = 1000;x = 3.14;x = 457000;在BASIC中,翻译器能考虑根据数字长度和类型分配空间。而在C++,则必须先声明变量类型再使用变量:int x1 = 1;int x = 1000;float y = 3.14;long z = 457000;这样,编译器就可以进行类型检查,确保程序运行时一切顺利。数据类型使用不当会导致编译错误或警告,以便分析和纠正之后再运行。有些数据类型有带符号和无符号两种。带符号(signed)数据类型可以包含正数和负数,而无符号(unsigned)数据类型只能包含正数。表1.1列出了C++中的数据类型、所要内存量和可能的取值范围。
表1.1C++数据类型(32位程序) 数据类型 字节 数取值范围 char 1 -128到126 unsigned char 1 0到255 short 2 -32,768到32,767 unsigned short 2 0到65,535 long 4 -2,147,483,648到2,147,483,648 unsigned long 4 0到4,294,967,295 int 4 同long unsigned int 4 同unsigned long float 4 1.2E-38到3.4E381 double 8 2.2E-308到1.8E3082 bool 1 true或false 从上表可以看出,int与long相同。那么,为什么C++还要区分这两种数据类型呢?实际上这是个遗留问题。在16位编程环境中,int要求2个字节而long要求4个字节。而在32位编程环境中,这两种数据都用4个字节存放。C++Builder只生成32位程序,所以int与long相同。说明 在C++ Builder和BorLand C++ 5.0中,Bool是个真正的数据类型。有些C++编译器有Bool要害字,则Bool不是个真正的数据类型。有时Bool只是个typedef,使Bool等价于int。typedef实际上建立别名,使编译器在一个符号与另一符号间划上等号。typedef的语法如下:typedef int Bool;这就告诉编译器:Bool是int的别名。说明 只有double和float数据类型使用浮点数(带小数点的数)。其它数据类型只涉及整数值。尽管integer数据类型也可以指定带小数点的数值,但小数部分会舍弃,只将整数部分赋予整型变量,例如:int x=3.75;得到的x取值为3。注重,这个整数值并不是四舍五入,而是放弃小数部分。顺便说一句,大多数Windows程序很少用到浮点数。C++可以在必要时进行不同数据类型间的换算。例如:short result;long num1 = 200;long num2 = 200;result = num1 * num2;这里我想将两个长整型的积赋予一个短整型。尽管这个公式混用了两种数据类型,但C++能够进行换算。计算结果会怎样呢?结果会让你大吃一惊,是25536,这是绕接(wrop)的结果。从表1.1可以看出,短整型的最大取值为32767,在最大值之上加1会怎么样呢?得到的是32768。这实际上与汽车里程计从99999回到00000的道理一样。为了说明这点,请输入并运行下列清单1.3中包含的程序。 清单1.3Wrapme.cpp 1: #include <iostream.h> 2: #include <conio.h> 3: #PRagma hdrstop 4: 5: int main(int argc,char **argv) 6: { 7:short x = 32767; 8:cout << " x = " << x << endl; 9:x++; 10: cout << " x = " << x << endl; 11: getch(); 12: return 0; 13: } 说明后面几节要介绍的有些清单没有下列语句: #include<condefs.h> C++ Builder生成新的控制台应用程序时会自动加上这条语句。这在你所用的程序中不是必须的,所以代码清单中将其省略。无论有无这条语句,程序运行结果是一致的。分析输出结果为:x=32767 x=32768假如用int数据类型,则不会有这个问题,因为int数据类型的取值范围在正向20亿之间,一般不会有绕回的问题。但这时程序可能会稍大一些,因为int需要4字节存储,而short只需要2字节存储。对于大多数应用程序,这个差别是不显著的。前面介绍了自动类型换算。有时C++无法进行换算,这时可能在编译器中产生编译错误,说Cannot convert from x to y(无法从x换算到Y)。编译器也可能警告说Conversion might lose significant digits(换算可能丢失显著位)。提示 编译器警告应当作编译器错误,因为它表明出了错误。我们应努力生成无警告的编译。有时警告无法避免,但一定要认真检查所有警告。应充分了解警告的原因并尽量予以纠正。