只读变量与常量 #
在 C 语言中,通过内联方式直接写到源代码中的字面量值一般被称为“常量”。
我们在前面提到过常量的一个性质,即“它们被定义后无法被再次修改”。这也就意味着,这些常量数据无法灵活地被开发者操控,它们只能在程序最开始出现的地方发挥作用。比如在前面定义变量的一系列代码中,出现的 “-10”、“2.0” 等数字值便是常量。这些值在被拷贝并赋值给相应的变量后便结束了使命。
用 const 关键字按照与定义变量相同语法定义的量,不也是常量吗?它与字面量常量有什么区别呢?
一般来说,我们会按照下面的方式使用 const 关键字:
const int vx = 10;
const int* px = &vx;
通常来说,在 C 语言中,使用 const 关键字修饰的变量定义语句,表示对于这些变量,我们无法在后续的程序中修改其对应或指针指向的值。因此,我们更倾向于称它们为“只读变量”,而非常量。当然,在程序的外在表现上,二者有一点是相同的:其值在第一次出现时便被确定,且无法在后续程序中被修改。
只读变量与字面量常量的一个最重要的不同点是,使用 const 修饰的只读变量不具有“常量表达式”的属性,因此无法用来表示定长数组大小,或使用在 case 语句中。常量表达式本身会在程序编译时被求值,而只读变量的值只能够在程序实际运行时才被得知。并且,编译器通常不会对只读变量进行内联处理,因此其求值不符合常量表达式的特征。
误用只读变量和常量会导致编译错误,下面这段代码展示了这类错误:
#include <stdio.h>
int main(void) {
const int vx = 10;
const int vy = 10;
int arr[vx] = {1, 2, 3}; // [错误1] 使用非常量表达式定义定长数组;
switch(vy) {
case vx: { // [错误2] 非常量表达式应用于 case 语句;
printf("Value matched!");
break;
}
}
}