2.3 常量

本篇学习字面量、`const`、宏常量和常量表达式的写法,并能用常量替代代码里的魔法数字。

常量

概念说明

常量表示在程序中不希望被修改的固定值。 在 C 语言里,常量既可以是直接写在代码中的字面量,也可以通过 constenum#define 给它们起一个有语义的名字。

常量最重要的价值不是“语法更高级”,而是让代码更清楚。 例如把 3.1415926 写成 PI,把 86400 写成 SECONDS_PER_DAY,代码含义会直观很多。

另外,很多初学者只把常量理解成数字。 其实字符常量、字符串字面量、十六进制字面量、转义字符和浮点字面量,都是常量世界的一部分。

语法/规则

  1. 数字、字符、字符串本身都是字面量,例如 100'A'"hello"
  2. 十进制、八进制和十六进制整数字面量都很常见,例如 260320x1A
  3. 字符和字符串里可以使用转义字符,例如 \n\t\\\"\0
  4. const 用来声明只读对象,例如 const int max_users = 100;
  5. #define 会在预处理阶段进行文本替换,例如 #define PI 3.14159
  6. 宏常量没有类型,const 对象有类型;在调试、类型检查和作用域表现上两者并不相同。
  7. 相邻的字符串字面量会自动拼接,这在书写较长提示文本时很实用。

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <stdio.h>

#define PI 3.14159
#define SECONDS_PER_DAY 86400

int main(void) {
    const int radius = 2;
    double area = PI * radius * radius;

    printf("radius = %d\n", radius);
    printf("area = %.2f\n", area);
    printf("seconds = %d\n", SECONDS_PER_DAY);
    printf("newline demo -> line1\nline2\n");
    return 0;
}

输出结果:

1
2
3
4
5
radius = 2
area = 12.57
seconds = 86400
newline demo -> line1
line2

语法补充

长字符串可以通过相邻字面量自动拼接,写法如下:

1
2
3
const char *message =
    "This is a long string. "
    "It will be concatenated by the compiler.";

这种写法比手动在每一行里加入很多转义符更易读。

常见错误

  1. 以为 const 对象和宏常量完全一样,忽略了它们在类型检查和调试上的区别。
  2. 直接修改 const 变量,或者通过不安全方式强行改写只读数据。
  3. 忽略前导 0 的含义,把八进制字面量误写成了十进制。
  4. 把大量业务含义不明的数字直接写进代码里,形成难以维护的魔法数字。
  5. 忘记转义字符会真正影响字符串内容,例如 \n 会换行、\0 会终止字符串。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字