什么是“编译时常量”?
“编译时常量”(compile-time constant)指的是在编译期间值就已经确定并固定的常量。在 C 语言中,字符串字面量属于这种类型。编译器在编译程序时会将这些字符串字面量存储在内存的只读区域,且它们的值在运行时不会改变。
编译时常量的特点
- 确定性:编译时常量在编译期间其值就已经确定,不会在运行时发生变化。
- 存储位置:通常存储在 只读 的内存区域,这意味着它们的值在程序运行期间不能被修改。
- 效率:由于值在编译时已知,编译器可以对这些常量进行优化,例如内联展开或其他优化手段。
字符串字面量作为编译时常量
字符串字面量在编译时确定并分配在只读内存区域中。每个字符串字面量都有一个固定的内存地址,程序运行时可以通过指针引用这个地址,但不能修改其内容。
示例代码
以下是一个简单的示例,说明字符串字面量和编译时常量的概念:
#include <stdio.h>
int main() {
// 字符串字面量
char *str1 = "Hello, World!";
printf("%s\n", str1);
// 尝试修改字符串字面量会导致未定义行为(通常会导致程序崩溃)
// str1[0] = 'h'; // 这行代码是不安全的,不能直接修改字符串字面量
return 0;
}
解释
-
字符串字面量的存储:
char *str1 = "Hello, World!";在这行代码中,字符串
"Hello, World!"是一个字符串字面量,它在编译时就被确定并存储在只读内存区域。指针str1指向这个只读内存区域的起始地址。 -
不可修改:
尝试修改字符串字面量的内容(例如str1[0] = 'h';)会导致未定义行为,因为它存储在只读内存区域。大多数情况下,这会导致程序崩溃。
编译时常量的例子
除了字符串字面量,编译时常量还包括其他类型的常量,如整数常量和浮点数常量。例如:
#include <stdio.h>
int main() {
const int num = 10; // 编译时常量
const float pi = 3.14; // 编译时常量
printf("Number: %d\n", num);
printf("Pi: %f\n", pi);
return 0;
}
在这个例子中,num 和 pi 都是编译时常量,它们的值在编译期间就已经确定,并且在程序运行时不会改变。
总结
编译时常量是指在编译期间就已确定值的常量。在 C 语言中,字符串字面量是典型的编译时常量,它们的值在编译时确定,并存储在只读内存区域。在程序运行时可以通过指针引用这些常量,但不能修改它们的值。

浙公网安备 33010602011771号