在C语言程序开发中,常量是指在程序运行期间其值不能被修改的量,明确合法的常量范围是编写正确代码的基础,不同类型的常量有不同的语法要求。

C语言合法常量的分类及定义规则
1. 整型常量
整型常量即整数类型常量,包含十进制、八进制、十六进制三种形式,每种形式都有对应的书写规则:
- 十进制整型常量:由0-9数字组成,不能以0开头,可带正负号,例如
123、-456、+789都是合法形式。 - 八进制整型常量:以0开头,后续由0-7数字组成,例如
0123、0765是合法形式,089属于非法形式,因为包含8这个超出八进制范围的字符。 - 十六进制整型常量:以0x或0X开头,后续由0-9、a-f、A-F组成,例如
0x1a、0XFF是合法形式,0xg8属于非法形式,因为g不在十六进制字符范围内。 - 整型常量还可以添加后缀表示类型,
u或U表示无符号整型,l或L表示长整型,例如123u、456L、789UL都是合法写法。
2. 实型常量
实型常量即浮点数类型常量,有两种书写形式:
- 十进制小数形式:由数字和小数点组成,必须有小数点,例如
3.14、-0.5、.89、5.都是合法形式,不能写成123这种没有小数点的形式作为实型常量。 - 指数形式:由十进制数、阶码标志e或E、阶码组成,e或E后面必须是整数,且不能省略,例如
1.23e4、-5.6E-2是合法形式,e3、2.5e、1.2e1.5都属于非法形式。
3. 字符常量
字符常量是用单引号括起来的单个字符,分为普通字符常量和转义字符常量:
- 普通字符常量:单引号内只能有一个普通字符,例如
'a'、'1'、'#'是合法形式,'ab'属于非法形式,因为单引号内包含多个字符。 - 转义字符常量:以反斜杠开头的特殊字符,用于表示无法直接输入或有特殊含义的字符,例如
'n'(换行符)、't'(制表符)、'\'(反斜杠本身)、'''(单引号)、'x41'(十六进制表示的字符A)、'101'(八进制表示的字符A)都是合法形式。
4. 字符串常量
字符串常量是用双引号括起来的零个或多个字符序列,例如"hello"、"123"、""(空字符串)都是合法形式。字符串常量在存储时会自动在末尾添加' '作为结束标志,这和字符常量有本质区别,例如"a"是字符串常量,存储为两个字符'a'和' ',而'a'是字符常量,仅存储一个字符'a'。
5. 符号常量
符号常量是用#define宏定义的常量,格式为#define 标识符 常量值,标识符的命名规则和变量一致,只能由字母、数字、下划线组成,且不能以数字开头,例如:
#include <stdio.h>
// 定义符号常量PI,值为3.14159
#define PI 3.14159
int main() {
printf("圆周率的值为:%fn", PI);
return 0;
}
上面的PI就是合法的符号常量,宏定义只是简单的文本替换,在预处理阶段完成替换,不属于C语言的关键字定义的常量类型。
6. const定义的常变量
C语言还支持用const关键字定义常变量,常变量具有常量的属性,值不能被修改,但本质上还是变量,有对应的数据类型,例如:
#include <stdio.h>
int main() {
const int MAX_NUM = 100; // 定义整型常变量MAX_NUM
const float RATE = 0.05f; // 定义浮点型常变量RATE
// MAX_NUM = 200; 这行代码会报错,因为常变量的值不能修改
printf("最大值:%d,利率:%fn", MAX_NUM, RATE);
return 0;
}
const定义的常变量是C语言合法的常量形式,和#define定义的符号常量不同,常变量有类型检查,更安全。
常见非法常量示例
下面列举一些不符合C语言规范的非法常量,帮助读者避坑:
| 非法常量 | 错误原因 |
|---|---|
| 098 | 八进制常量只能包含0-7数字,8超出范围 |
| 2.5e | 指数形式的e后面必须跟整数,不能省略 |
| 'abc' | 字符常量单引号内只能有一个字符 |
| 0x12g | 十六进制常量只能包含0-9、a-f、A-F,g超出范围 |
| 123Ll | 长整型后缀只能出现一次l或L,重复书写属于非法 |
合法常量的判断要点
判断一个量是否是C语言合法常量,可以遵循以下要点:
- 先明确常量的类型,对应类型的书写规则必须满足,比如八进制必须以0开头,指数形式e后必须是整数。
- 字符常量用单引号,字符串常量用双引号,不能混用,单引号内只能有一个字符,双引号内可以有多个字符。
- 用#define定义的符号常量,标识符必须符合命名规则,不能包含特殊字符。
- const定义的常变量必须初始化,且后续不能修改其值。
注意:常量和常变量有区别,#define定义的符号常量没有类型,是文本替换,const定义的常变量有类型,是特殊的变量,两者都属于C语言认可的合法常量范畴。