### 变量

其值可以改变的量称为“变量”。变量提供了一个具有名称（变量名）的存储区域，使得开发人员可以通过名称来对存储区域进行读写。与常量不同的是，变量可以在程序中被随意赋值。对于每一个变量，都具有两个属性，也就是通常所说的左值和右值。所谓左值，是指变量的地址值，即存储变量值的内存地址。右值是指变量的数据值，即内存地址中存储的数据。图 1 描述了变量的性质。

图 1 变量描述

图 2 描述了变量实际的存储情况。

变量 nSum 的地址

变量 nSum 的数据值，十六进制 0064，即十进制 100

图 2 变量实际存储效果图

在程序中定义变量时，首先是变量的数据类型，然后是变量名。下面的代码定义了两个变量。

int min = 0 ;

char* pch ;

在定义变量时，可以对变量进行初始化。即为其设置初始值。例如，上面代码定义了一个 min 整型变量，将其初始化为 0。在初始化变量时，可以将变量初始化为自身。例如：

int min = min;

这样做虽然是合法的，但是也是很“愚蠢”和不明智的。在初始化变量时，也可以进行隐式初始化。例如：

int min(10);

当一条语句定义多个变量时，可以为多个变量同时指定初始值，并且后续变量可以利用之前变量作为初始值。例如：

int min = 10 , max = min+50;

在定义变量时需要指定数据类型，对于 C++内置的数据类型编译器会提供特殊的构造函数。用户可以利用每种数据类型的构造函数来初始化变量。例如：

int min = int(); //初始化 min 为 0

double max = double(); //初始化 max 为 0.0

在定义变量时，有时会使用关键字 volatile。该关键字表示变量可以被某些意外的因素改变。当编译器遇到该关键字时，将不对变量进行优化，从而提供对变量的直接访问。多数编译器在对程序进行编译前，会对代码进行优化。例如，定义一个变量，当变量在数条语句执行后仍没有出现，编译器会将其放人寄存器或内部缓冲区。当用到变量时，再将其取出。这样会导致一种情况，当变量的值被外部环境意外地改变了，例如，一个全局变量的地址被专递到了系统时钟的进程中，使其时时显示系统当前的时间。当程序代码长时间没有访问该全局变量，那么编译器可能将全局变量数据放人寄存器中，当程序突然访问全局变量时，将从寄存器中取出。但是由于全局变量的值被时时的修改了，程序从寄存器中取出的数据与全局变量当前的数据是对应不上的。如果对全局变量使用 volatile 关键字，那么编译器将不会对其进行优化，程序每次访问时，均从变量的内存地址访问。这样就不会出现上述情况了。

为了说明 volatile 关键字的作用，下面做一下测试。为了在一个程序中间接地修改变量，下面使用了汇编代码来修改变量。由于在 Visual C++6.0 的 Debug 模式下编译器不会对代码进行优化。因此，下面的测试是在 Release 模式下进行的。

注意：以下示例中使用了汇编代码，只是为了举例时可以更好的说明，用户不需要掌握汇编内容。

示例，未使用 volatile 关键字定义变量

void main()

{

int var = 1;

int temp = var;

printf("var=%d\n",var);

__asm

{

mov dword ptr [ebp-4], 10h

}

int ret = var;

printf("var= %d\n",ret);

}

执行上述代码，运行结果如图 3 所示。

图 3 volatile 关键字测试 1

从图 3 中可以发现，变量 var 的值并没有被更新（汇编代码改变了 var 的值）。重新修改代码，将变量 var 设置为 volatile 关键字。

示例，使用 volatile 关键字定义变量：

void main()

{

volatile int var = 1;

int temp = var;

printf("var= %d\n",var);

__asm

{

mov dword ptr [ebp-4], 10h

}

int ret = var;

printf("var= %d\n",ret);

}

运行代码，效果如图 4 所示。

图 4 volatile 关键字测试 2

从图 4 可以发现，变量 var 的值被及时更新了，因为编译器每次遇到 var，均会直接从 var 的内存中读取数据。