Skip to content

c_constants_and_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 int
0xFeeL // long int (十六进制)
0123 // octal (十进制 83)
123456789LL // long long int
40000U // 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 // double
3.14f // float
123.456L // long double
1.0E6 // double (一百万)
0.0 // double
-1.23e-2f // float (-0.0123)
// 无效示例:
// 510E // 指数不完整
// 210f // float 没有小数点或指数(需要 210.0f 或类似形式)
// .e55 // 指数前缺少整数或小数部分

表示单个字符,用单引号括起来(例如,‘a’、’%’、‘7’)。它们具有整型(int)类型。

特殊字符可以使用转义序列表示:

转义序列含义
\\反斜杠(\)字符
\'单引号(')字符
\"双引号(")字符
\?问号(?)字符
\a警报 (响铃)
\b退格
\f换页
\n换行
\r回车
\t水平制表符
\v垂直制表符
\0空字符
\ooo八进制数 (一到三位数字)
\xhh...十六进制数 (一位或多位数字)

示例:

'A' // 普通字符
'\n' // 换行字符
'\t' // 制表符
'\'' // 单引号字符
'\0' // 空字符 (整型值 0)
'\x41' // 'A' 的十六进制表示
'\101' // 'A' 的八进制表示

表示一系列字符,用双引号括起来(例如,“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)”

使用命名常量使代码更具可读性,也更容易修改。有两种主要方式:

  1. 使用 #define 预处理指令。
  2. 使用 const 关键字。

创建一个宏,预处理器在编译前将其替换为它的值。这是一种简单的文本替换。

#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 不创建带类型的变量;它只是纯文本替换。

声明一个变量,其值在初始化后不能改变。这些是实际的变量,具有类型,提供了比 #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,因为它们提供类型检查,并且更好地集成到语言的作用域规则中。