变量就是机器一个内存位置的符号名,在该内存位置可以保存数据,并可通过符号名进行访问。变量有三个特征: ◇ 每一个变量有一个名字,其命名规则与标识符相同。 ◇ 每一个变量有一个类型。 ◇ 每一个变量保存一个值。如果需要变量保存某一个值,就把该值赋给变量。 为了提高程序的可读性,给变量命名时,应该注意使用有意义的名字,以帮助描述变量所保存的值。最好是一开始就坚持使用小写字母。例如:要用一个变量保存工资总额,可以使用total_payroll,也可以使用XYZ34作变量名,它们都是合法的名字。但使用前者比使用后者就更好,因为从变量名,就能大致知道它保存了什么样的值,便于记忆。 在使用一个变量之前,必须先定义。变量的定义的一般格式如下: 数据类型 变量名1[= 初始值1], 变量名2[= 初始值2], ...; "数据类型"是指C++有效的数据类型,如int、double、long等。方括号中的内容是可选的,它是在变量定义时,给变量赋初值。下面是几个变量定义的实例: long n; //定义了一个长整型变量n,未赋初值 double a, b = 0.5; //定义双精度型变量a、b,a未赋初值,b的初值为0.5
下面是一个使用变量的程序实例:
 |
 |
程序2-3: |
|
#include <iostream.h> int main (void) { 1. int workDays = 5; 2. float workHours, payRate, weeklyPay; 3. workHours = 7.5; payRate = 38.55; 4. weeklyPay = workDays * workHours * payRate; 5. cout << "Weekly Pay = " << weeklyPay << '\n'; } |
 | 第一行定义了一个整型变量workDays,并初始化为5,表示一周的工作天数。 第二行定义了三个实型变量,分别表示每天工作的小时数、每小时应支付的薪水及每周应支付的薪水。 第三行是两个赋值语句。7.5 赋给变量workHours,38.55赋给变量payRate。 第四行是计算每周的工资,即三个变量workDays、workHours、payRate的积,*是乘运算符,结果保存在变量weeklyPay变量中。 第五行输出字符串"Weekly Pay = "、变量weeklyPay 的值和换行符。 本程序的运行结果如下: Weekly Pay = 1445.625 如果我们定义一个变量时,没有给它赋初值,它的值是不定的。例如,在上面的第四行执行前,weeklyPay的值是不定的。 变量第一次赋值称之为初始化,变量在使用之前应当先初始化。
2.4.1 整型 整型变量可用short、int、long定义,区别在于int占用机器的字节数比short多或一样,而long占用的字节数比int多或一样。例如: short age = 20; int salary = 65000; long price = 4500000; 缺省的情况下,整型变量假定为有符号的,但是,使用unsigned关键字,也可以把整型变量定义为无符号的。当然,定义整型变量时,也可以使用signed关键字,但是多余的。 unsigned short age = 20; unsigned int salary = 65000; unsigned long price = 4500000; 一个整型数,例如1984,总是被假定为int类型,除非有L或l后缀,才被处理为long int类型。同样,一个整型数也可以加U或u后缀,指定为unsigned类型。例如表2-6: 整型数能被表示成10进制、8进制和16进制。如果一个整型数有前缀0,则表示是8进制数,有前缀0x或0X,表示是16进制数。例如: 92 // 十进制 0134 // 8进制 0x5C // 16进制 8进制数只能使用数字0~7,16进制数可用0~7及A~F (或a~f)表示。
|
 |
表2-6 |
|
1984L |
1984l |
1984U |
1984u |
1984LU |
1984lu | |
 | 整型是常用的一种数据类型,但是,它的大小是不固定的,这是由操作系统决定的。在计算机中任何信息都是以二进制的形式存储的,二进制数每一位是0或1,八位组成一个字节(byte),两个字节组成一个字(word),四个字节组成一个双字(dword)。 整数能存储的最大值是由计算机给它分配的存储空间的大小决定的,而整数所占的存储空间因不同的计算机而异。例如,某种计算机可能用16位(两个字节)来存储一个整数,而另一种计算机则可能用32位(四个字节)来存储。 当一个整数存储在计算机中时,左起第一位叫做第0位,即符号位,它用来表示该数是正数或负数。如果是负数,符号位被置1,正数则为0。 两个字节能表示的整数范围是-32768~32767, 四个字节能表示的整数范围则增加到-2147463648~2147483647。 由于整数所占的存储空间在不同的计算机上是不同的,所以在代码移植时容易出现问题。
2.4.2 浮点型 浮点型变量可用float或double定义,后者在机器内存中占用的字节数更多,所以有效位数更多,表示的数字范围也更大。例如: float interestRate = 0.06; double pi = 3.141592654; 一个实型数,如0.06总是假定为double型,除非有F或f后缀,才被处理为float型。若有L 或 l后缀,则被处理为long double型。例如表2-7: 实型数也可以表示成指数形式。例如:0.002164可以写成:
2.164E-3或2.164e-3 E或e代表指数。
 |
表2-7 |
 |
1984L |
1984l |
1984U |
1984u |
1984LU |
1984lu | |
浮点型分为单精度浮点型和双精度浮点型,就是所谓的float和double。下表列出了它们的主要数据:
 |
 |
表2-8 |
|
类型 |
字节数 |
有效位(十进制) |
指数长度 |
尾数长度 |
float |
4 |
6-7 |
8bits |
23bits |
double |
8 |
15-16 |
11bits |
52bits | |
 |
浮点数是由符号位、指数位和尾数位构成的,上表已列出浮点型的指数位长度和尾数位长度。以单精度浮点数为例:它是由1个符号位、8位指数位和23位尾数组成,共32位,4个字节。 2.4.3 字符型 字符变量用char定义,一个字符变量仅占用一个字节,存放该字符的编码。该编码是一个数字,并依赖于所使用的编码系统(即与机器相关)。最普通的编码是ASCII(American Standard Code for Information Interchange),即美国信息交换标准编码。例如:字符A的ASCII码为65,字符a的ASCII码为97。 char ch = 'A'; 象整型数一样,字符变量也可被指定为signed或unsigned。大多数机器上,char与signed char意义相同。有些机器上,char可能与unsigned char意义相同。一个有符号字符变量可以保存-128 ~127之间的整数,而一个无符号字符变量可以保存0 ~255之间的整数,它们均可用于表示小整数,象整型数一样赋值: signed char offset = -88; unsigned char row = 2, column = 26; 一个字符是用一对单引号包围起来,例如:'A'。C++中还有一些不能打印的特殊字符,称之为转义字符。例如2-1: 字符也可以用它们的编码指定,转义字符通常用三位8进制数表示,例如2-2:(假定为ASCII码): C++的字符由下列字符组成。 1、大小写英文字母 a~z,A~Z 2、数字字符 0~9 3、特殊符号 空格 ! # % ^ & * _ - + = ~ < > / \ | . , ; ? ' " ( ) [ ] { }
C++语言把字符型变量当作一个较小的整型量,可以象整型量一样使用它。下面举一个例子说明:
 |
 |
程序2-6 |
|
#include <iostream.h> void main() { char c1 = 'a'; char c2 = 'b'; char c3,c4; c3 = c1 - ('a' - 'A'); c4 = c2 - ('a' - 'A'); cout<<c3<<c4<<endl; } 运行结果为: A B |
 |
程序中的'a' - 'A'是大小写字母之间的差值,其值为32。所以我们也可以把程序写成: c3 = c1 - 32; c4 = c2 - 32; 如果我们想看一看c3、c4中到底存储的值是多少,可以这样: cout<<(int)c3<<(int)c4<<endl; 其运行结果为: 65 66 注意:在内存中,字符数据以ASCII码存储,即以整数表示,'0'和0是不同的。
 |
例2-1: |
|
'\n' // 换行 '\r' // 回车 '\t' // 水平tab '\v' // 垂直tab '\b' // 退格 '\f' // 进纸 '\'' // 单引号 (') '\"' // 双引号 (") '\\' // 反斜杠 (\) |
 |
 |
 |
例2-2: |
|
'\12' //换行(10进制编码 = 10) '\11' // 水平tab (10进制编码= 9) '\101' // 'A' (10进制编码= 65) '\0' // null (10进制编码= 0) |
2.4.4 字符串 字符串是一个连续的字符系列,有一个'\0'字符结尾。假定有一个字符串为"HELLO",它在内存中的存储,参见图2-2。 一个字符串用一对双引号包围起来,例如:"HELLO",编译器在每一字符串的结尾增加'\0' 结尾符。字符串可以由任意字符组成,例如: "Name\tAddress\tTelephone" // tab-分隔字符 "ASCII character 65: \101" // 'A' 用'101'指定 一个长字符串可以占两行或多行,但在最后一行之前的各行应用反斜杠结尾,例如: "Example to show \ the use of backslash for \ writing a long string" 上面的字符串与下面的单行字符串等价: "Example to show the use of backslash for writing a long string" 需要注意的是: (1) 不要把字符与字符串混淆了。例如:"A"与'A'不等价,前者由两个字节组成(字符'A'与字符'\0'),而后者只有一个字节。 (2) 最短的字符串是空字符串(""),它仅由一个结尾符'\0'组成。 (3) C++中,没有字符串类型,而是用字符数组来处理字符串,这将在第六章中介绍。
字符串常量与字符常量不同,字符串常量是用一对双引号括起来的零个或多个ASCII字符的序列,并以NULL(ASCII码值为0)结束。例如:
 |
 |
例2-3: |
|
"This is a character string." "CHINA" "0123456789" "a" "$10000.00" " "(引号中有一个空格) ""(引号中什么也没有) "\n"(引号中有一个转义字符) |
 | 字符串常量在内存中存储时,系统自动为每个字符串常量的尾部加一个字符\0,用以标识这字符串的结束,如字符串 "CHINA" 在内存中的形式是:
了解这一点,我们就可以区分字符串"a"和字符'a'有何不同了。它们在内存中的形式分别为:
2.4.5 布尔型 布尔类型变量用bool关键字定义,其值为true或false,true和false都是C++的关键字。整型值也可赋给bool变量,但会被隐式转换成true或false。转换规则如下:整型值非0时,转换为true,整型值为0时,转换为false。 同样,布尔值也可赋值给整型变量,但要进行隐式转换,转换规则为:布尔值为true时,转换为1,布尔值为false时,转换为0。 布尔值也可插入输出流cout,当布尔值为true时,在屏幕上打印1,当布尔值为bool时,在屏幕上打印0。例如2-5。
C没有bool这个数据类型,C++中定义了bool类型,它只有两个值:true和false。所有的条件表达式返回类型都是bool型,比如n!=0(!=是"不等于"运算符,我们在本章后面要介绍)根据不同的n,返回true或false。true和false有如下关系: !true==false; !false==true; !是取反运算符,我们在本章后面要介绍。我们看一个简单的例子:"if (exp1) statement1;"。这个语句的意思是:如果表达式exp1的值是true,就执行statement1,否则就不执行。 如果对一个bool类型变量使用前缀或后缀自增(++)运算符,不管这个变量是false还是true,这个变量将变为true。但是不能对bool类型变量使用前缀或后缀自减(――)运算符(有关自增、自减运算符的内容在本章的后面介绍)。如:
 |
 |
例2-4: |
|
#include "iostream.h" int main(int argc, char* argv[]) { bool b; b=false; cout<<b++; cout<<b++; cout<<b; return 0; } 程序运行结果为: 011 |
 | 一个右值为bool型变量将被自动转换成整型,且false被转换成0,true被转换成1。所以上面程序中输出的是011,代表的意思是false、true、true。 C++中还有一种比较特殊的类型,它用于定义函数返回类型,或者用于定义"一般类型"的指针,即该指针可以指向任意类型数据(被const和volatile修饰的变量除外),但是不能定义空类型的变量。例如, 函数声明:void func(); 指针定义:void *p;
 |
 |
例2-5: |
|
cout << "A true value: "; cout << true; cout << endl; cout << "A false value: "; cout << false; cout << endl; 输出结果为: A true value: 1 A false value: 0 |
|