在 C 语言中,常量指的是在程序运行期间其值不会发生改变的量。下面介绍 C 语言里常量的类型、定义方式以及使用示例:
一、字面常量(Literal Constants)
字面常量是在代码中直接给出的固定值,它会依据书写形式来确定自身的数据类型。
1. 整数常量
- 十进制:像
100
、-5
这类就是十进制整数常量。 - 八进制:以
0
开头的数,例如012
(相当于十进制的 10)。 - 十六进制:以
0x
或者0X
开头,比如0xFF
(对应十进制的 255)。 - 后缀:可以使用
L
(表示长整型)和U
(表示无符号型),像100UL
就是一个无符号长整型常量。
2. 浮点常量
- 小数形式:例如
3.14
、0.5
、.25
。 - 指数形式:如
1.2e3
(也就是 1200.0)、5E-2
(即 0.05)。 - 后缀:
f
或F
表示单精度浮点数,l
或L
表示长双精度浮点数,例如3.14F
。
3. 字符常量
- 用单引号括起来的单个字符,例如
'A'
、'\n'
。 - 转义序列:像
'\t'
(水平制表符)、'\x41'
(十六进制表示的字符A
)都属于转义序列。
4. 字符串常量
- 由双引号括起来的字符序列,例如
"Hello"
、"123\n"
。 - 字符串在内存中会以
'\0'
作为结束标志,所以字符串"A"
实际上包含两个字符:'A'
和'\0'
。
二、符号常量(Symbolic Constants)
符号常量是赋予常量一个名字,通过名字来引用该常量。
1. #define
预处理器指令(宏常量)
#define PI 3.14159
#define MAX_SIZE 100
- 特点:在编译前会进行文本替换,没有类型检查。
- 示例:
printf("圆的周长: %f\n", 2 * PI * r);
2. const
关键字(常量变量)
const int DAYS_IN_WEEK = 7;
const float GRAVITY = 9.8f;
- 特点:具有类型,存储在内存中,不能被修改。
- 示例:
int arr[DAYS_IN_WEEK]; // 合法(C99及以后版本支持)
三、枚举常量(Enumeration Constants)
枚举常量用于定义一组具名的整数常量。
enum Color { RED, GREEN, BLUE }; // 默认从0开始
enum Weekday { MON = 1, TUE, WED, THU, FRI, SAT, SUN };
- 示例:
enum Color c = GREEN; // c 的值为1
printf("GREEN = %d\n", c); // 输出: GREEN = 1
四、常量表达式
常量表达式是在编译时就能计算出结果的表达式。
#define A 5
#define B 3
const int C = A + B; // C 的值在编译时确定为8
- 应用场景:可用于数组大小定义、
case
标签等。
int arr[A * B]; // 合法
arr[]
是用于声明数组(Array)的语法。数组是一种存储相同类型元素的连续内存区域,通过索引(下标)访问每个元素。
五、注意事项
- 字符串与字符的区别
'A'
是字符常量,类型为int
,占 1 个字节。"A"
是字符串常量,类型为char[2]
,包含'A'
和'\0'
。
- 宏常量 vs
const
变量- 宏常量:没有类型,仅进行简单替换,可能会产生副作用。
const
变量:有类型,具备类型检查和作用域规则。
- 指针常量
const int* p
:指针指向的内容不能被修改。int* const p
:指针本身的值不能被修改。const int* const p
:指针及其指向的内容都不能被修改。
示例代码
#include <stdio.h>
#define MAX(a, b) ((a) > (b) ? (a) : (b)) // 宏函数
int main() {
const int MAX_SCORE = 100;
enum Month { JAN = 1, FEB, MAR };
int x = 5, y = 10;
printf("最大值: %d\n", MAX(x, y)); // 使用宏函数
printf("2月是第 %d 个月\n", FEB); // 输出: 2月是第 2 个月
// MAX_SCORE = 200; // 错误:不能修改常量
return 0;
}