由于变量的定义不是可执行代码,因此要求局部变量的定义必须位于用“{}包围的程序块”的开头,即在可执行代码的前面。
ANSI C规定:可以使用const关键字声明常量,修饰符const可以用在类型说明符前,也可以用在类型说明符后。比如:
int const MAX_LENGTH = 78; // 命名常变量的最佳方式是使用大写字母
const int MAX_LENGTH = 78; // MAX_LENGTH的初值为78
虽然const修饰MAX_LENGTH的值是常量,而实际上MAX_LENGTH却是一个“只读变量”。编译器仅给出了与只
读变量MAX_LENGTH对应的内存地址,却并没有为只读变量MAX_LENGTH分配存储单元,而是将它们保存在符号表中,在编译时直接进行“替换”优化。因此使用const修饰常变量,可以节省空间,避免了不必要的内存分配,而且执行效率更高。
既然使用const也可以定义常量,那么它与符号常量到底有什么区别呢?
由于const定义的常量有数据类型,因此编译器会对用const声明的只读变量进行类型校验,以减少出错的几率;虽然可以使用#define指令定义符号常量,但它在预编译进行字符替换之后,符号常量就不存在了,因为#define宏定义的立即数是没有类型的。很多开发环境只能调试const声明的常量,而不支持#define。由此可见,const比#define声明常量更有优势。因此const的引入不仅消除预编译指令的缺点,而且继承了预编译指令的优点。
虽然在很多时候const是#define的优化,但有时#define比const有优势,因为#define不仅声明常量,而且还可以声明“带宏的参数”,这是const无法做到的,所以说const相对于#define的优势仅限定在声明常量上。