c_constants_and_literals
C - 常量和字面量
Section titled “C - 常量和字面量”常量是程序执行期间不能改变的固定值。这些固定值本身通常被称为字面量。
字面量可以表示基本数据类型:整数字面量、浮点数字面量、字符字面量和字符串字面量。还存在枚举常量。
命名常量与字面量不同,它为固定值提供一个符号名称,提高了可读性和可维护性。
整数字面量(Integer Literals)
Section titled “整数字面量(Integer Literals)”表示整数。可以指定不同的进制:
- 十进制: 无前缀(例如,
123、-5)。 - 八进制: 前缀
0(例如,017,即十进制 15)。允许的数字 0-7。 - 十六进制: 前缀
0x或0X(例如,0xFF,即十进制 255;0x1a)。允许的数字 0-9、a-f、A-F。
后缀可以指定类型:
U或u:无符号 (Unsigned)(例如,100U、0xFU)。L或l:长整型 (Long)(例如,12345L、077L)。LL或ll:长长整型 (Long Long) (C99)(例如,9876543210LL、1ULL)。
后缀可以组合(例如,100UL、50LLU)。大小写和顺序不重要(UL 和 lu 相同)。
示例:
212 // int (十进制)215u // unsigned int0xFeeL // long int (十六进制)0123 // octal (十进制 83)123456789LL // long long int40000U // unsigned int
// 无效示例:// 078 // 错误:8 不是八进制数字// 032UU // 错误:不能重复 U 后缀浮点数字面量(Floating-Point Literals)
Section titled “浮点数字面量(Floating-Point Literals)”表示带小数部分(实数)的数字。可以有整数部分、小数点、小数部分和指数部分(使用 e 或 E)。
表示形式:
- 十进制形式: 必须包含小数点、指数或两者都有(例如,
3.14159、123.、.456、1e5)。 - 指数形式: 整数/小数部分后跟
e或E,然后是可选的带符号指数(例如,314159E-5L、1.23e+2)。
后缀指定类型(默认是 double):
f或F:float(例如,3.14f、1.0F、2.5e-3f)。l或L:long double(例如,0.123456789L、1.2E+10L)。
示例:
3.14159 // double3.14f // float123.456L // long double1.0E6 // double (一百万)0.0 // double-1.23e-2f // float (-0.0123)
// 无效示例:// 510E // 指数不完整// 210f // float 没有小数点或指数(需要 210.0f 或类似形式)// .e55 // 指数前缺少整数或小数部分字符字面量(Character Literals)
Section titled “字符字面量(Character Literals)”表示单个字符,用单引号括起来(例如,‘a’、’%’、‘7’)。它们具有整型(int)类型。
特殊字符可以使用转义序列表示:
| 转义序列 | 含义 |
|---|---|
\\ | 反斜杠(\)字符 |
\' | 单引号(')字符 |
\" | 双引号(")字符 |
\? | 问号(?)字符 |
\a | 警报 (响铃) |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\0 | 空字符 |
\ooo | 八进制数 (一到三位数字) |
\xhh... | 十六进制数 (一位或多位数字) |
示例:
'A' // 普通字符'\n' // 换行字符'\t' // 制表符'\'' // 单引号字符'\0' // 空字符 (整型值 0)'\x41' // 'A' 的十六进制表示'\101' // 'A' 的八进制表示字符串字面量(String Literals)
Section titled “字符串字面量(String Literals)”表示一系列字符,用双引号括起来(例如,“Hello, World!”)。它们存储为字符数组,自动以空字符(\0)终止。
字符串字面量可以包含转义序列。长的字符串字面量可以通过在一行末尾加上反斜杠 </code> 来跨行(反斜杠和换行符被忽略),或者通过连接相邻的字符串字面量(编译器会组合它们)来表示。
示例(都表示相同的字符串 “Hello, dear”):
"Hello, dear"
"Hello, \dear"
"Hello, " "dear"
包含转义序列的示例:
"First line\nSecond line\tIndented""Display a backslash: \\ and a double quote: \""
定义命名常量(Defining Named Constants)
Section titled “定义命名常量(Defining Named Constants)”
使用命名常量使代码更具可读性,也更容易修改。有两种主要方式:
- 使用
#define 预处理指令。
- 使用
const 关键字。
1. #define 预处理器
Section titled “1. #define 预处理器”
创建一个宏,预处理器在编译前将其替换为它的值。这是一种简单的文本替换。
#define PI 3.14159#define MAX_USERS 100#define GREETING "Welcome!"
// 用法:double circumference = 2 * PI * radius;if (user_count < MAX_USERS) { /* ... */ }printf("%s\n", GREETING);
约定上,#define 常量名使用大写字母。注意:#define 不创建带类型的变量;它只是纯文本替换。
2. const 关键字
Section titled “2. const 关键字”
声明一个变量,其值在初始化后不能改变。这些是实际的变量,具有类型,提供了比 #define 更好的类型安全。
const type variable_name = value;
示例:
const double PI = 3.14159;const int MAX_USERS = 100;const char *GREETING = "Welcome!"; // 指向常量字符串的指针
// 用法:double circumference = 2 * PI * radius;if (user_count < MAX_USERS) { /* ... */ }printf("%s\n", GREETING);
// 尝试修改 const 变量会导致编译时错误:// PI = 3.14; // 错误!// MAX_USERS++; // 错误!
最佳实践: 在定义命名常量时,尽可能优先使用 const 变量而非 #define,因为它们提供类型检查,并且更好地集成到语言的作用域规则中。