8.1.2 const的安全性

const的作用不仅限于在常数表达式里代替#defines。如果用运行期间产生的值初始化一个变量而且知道在变量生命期内是不变的,则用const限定该变量是程序设计中的一个很好的做法。如果偶然试图改变它,编译器会给出出错信息。下面是一个例子:

8.1.2 const的安全性 - 图1

我们会发现,i是一个编译期间的const,但j是从i中计算出来的。然而,由于i是一个const, j的计算值来自一个常数表达式,而它自身也是一个编译期间的const。紧接下面的一行需要j的地址,所以迫使编译器给j分配存储空间。即使分配了存储空间,把j值保存在程序的某个地方,由于编译器知道j是const,而且知道j值是有效的,因此,这仍不能妨碍在决定数组buf的大小时使用j。

在主函数main()里,对于标识符c有另一种const,因为其值在编译期间是不知道的。这意味着需要存储空间,而编译器不想保留它的符号表里的任何东西(和C语言的行为一样)。初始化必须在定义点进行,而且一旦初始化,其值就不能改变。我们看到c2由c的值计算出来,也会看到这类常量的作用域与其他任何类型const的作用域是一样的—这是对#define用法的另一种改进。

就实际来说,如果想让一个值不变,就应该使之成为const。这不仅为防止意外的更改提供安全措施,也消除了读存储器和读内存操作,使编译器产生的代码更有效。