一、常量的分类
1. 字面常量(Literal Constants)
直接写在代码中的固定值,没有标识符名称。
1.1 整型常量
-
表示方式:
-
十进制:
123
,-45
-
八进制(以
0
开头):0123
(十进制83) -
十六进制(以
0x
或0X
开头):0x1A
(十进制26)
-
-
后缀:
-
L
或l
:表示长整型(如123L
) -
LL
或ll
:表示长长整型(如123LL
) -
U
或u
:表示无符号整型(如123U
)
-
1.2 浮点型常量
-
表示方式:
-
小数形式:
3.14
,-0.5
-
指数形式(科学计数法):
1.23e5
(即1.23×10⁵)
-
-
后缀:
-
F
或f
:单精度浮点(如3.14F
) -
默认无后缀为
double
类型(如3.14
)
-
1.3 字符常量
-
单引号括起来的单个字符:
'A'
,'5'
,'#'
-
转义字符:
-
\n
(换行)、\t
(制表符)、\\
(反斜杠)、\'
(单引号)、\"
(双引号) -
ASCII码值:
\x41
(十六进制,表示'A')、\101
(八进制,表示'A')
-
1.4 字符串常量
-
双引号括起来的字符序列:
"Hello, World!"
-
存储方式:以
\0
(空字符)结尾的字符数组。
2. const
修饰的常量
-
通过
const
关键字定义,具有类型和内存地址。 -
语法:
const int MAX = 100;
-
const float PI = 3.14f;
-
特点:
-
不可修改(编译时报错)。
-
作用域取决于定义位置(全局或局部)。
-
实际存储于内存中,可通过指针强制修改(不推荐)。
-
3. 枚举常量(Enum)
-
通过
enum
定义一组整型常量。 -
语法:
enum Week { Mon, Tue, Wed, Thu = 5, Fri }; // Mon=0, Tue=1, Wed=2, Thu=5, Fri=6
-
特点:
-
默认从0开始递增,可显式赋值。
-
枚举值是整型常量,可直接用于比较和运算。
-
4. 宏常量(#define)
-
通过预处理器指令
#define
定义。 -
语法:
#define MAX 100 #define PI 3.14159 #define MSG "Hello"
-
特点:
-
预处理阶段直接替换文本,不占用内存。
-
无类型检查,可能导致意外错误。
-
作用域从定义处到文件结束,可用
#undef
取消定义。
-
二、常量的应用场景
-
避免魔法数字:用常量代替代码中的直接数值,提高可读性。
#define MAX_STUDENTS 50 const int BUFFER_SIZE = 1024;
-
配置参数:定义程序中固定不变的参数。
const float GRAVITY = 9.8f; #define TIMEOUT 30
-
接口约束:限制函数参数范围。
enum ErrorCode { SUCCESS = 0, ERROR_INVALID_INPUT, ERROR_FILE_NOT_FOUND };
三、注意事项
-
const
与#define
的区别:-
const
有类型检查,#define
是文本替换。 -
const
占用内存,#define
不占用。 -
const
支持作用域规则,#define
全局有效。
-
-
字符串常量的拼接:
char* str = "Hello" " World!"; // 等效于"Hello World!"
-
枚举的底层类型:
-
C语言中枚举常量本质是整型,C11标准允许指定枚举的底层类型(如
enum Week : char
)。
-
-
指针与常量:
-
常量指针:
const int* p
(指向内容不可变) -
指针常量:
int* const p
(指针本身不可变)
-
四、代码示例
#include <stdio.h>
#define PI 3.14159
const int MAX = 100;
enum Color { RED, GREEN, BLUE };
int main() {
const float gravity = 9.8f;
printf("PI = %f\n", PI); // 输出宏常量
printf("MAX = %d\n", MAX); // 输出const常量
printf("Gravity = %.1f\n", gravity);
printf("RED = %d\n", RED); // 输出枚举常量
return 0;
}
五、总结
常量类型 | 优点 | 缺点 |
---|---|---|
字面常量 | 直接使用,无需定义 | 可读性差,难维护 |
const 常量 | 类型安全,支持作用域 | 占用内存 |
枚举常量 | 提高代码可读性 | 仅支持整型值 |
宏常量(#define) | 不占内存,灵活 | 无类型检查,调试困难 |
根据需求选择合适的常量类型,建议优先使用const
和枚举以提高代码健壮性。