Appearance
[English version](/posts/c教程/en-US/02-Language Basics/012-Constants, Literals, and Enumerations)
C 程序通常依赖于在整个代码中使用的永不改变的值、数字、字符或命名常量。您可以给它们赋予有意义的名称,并保持程序的可读性、安全性和易于维护性,而不是到处散布神奇的数字。
小代码
#include <stdio.h>
#define PI 3.14159 // preprocessor constant
const int DAYS_IN_WEEK = 7; // read-only variable
enum Direction { NORTH, EAST, SOUTH, WEST }; // enumerated constants
int main(void) {
printf("Pi: %.2f\n", PI);
printf("Days in a week: %d\n", DAYS_IN_WEEK);
printf("Direction EAST has value: %d\n", EAST);
return 0;
}输出:
Pi: 3.14
Days in a week: 7
Direction EAST has value: 1C 中的常量
预处理器常数 (#define) 这些在编译前被替换。将它们视为文本替换,而不是变量。
#define MAX_USERS 100
printf("Max users: %d\n", MAX_USERS);- 不使用内存。
- 没有类型检查,编译器只是替换文本。
常量变量(const) 这些是存储在内存中的实际变量,但初始化后无法修改。
const double SPEED_OF_LIGHT = 299792458.0;- 类型安全。
- 现代 C 代码中常量的首选。
文字 这些是直接写入代码中的固定值:
42 // integer literal
3.14 // floating-point literal
'A' // character literal
"Hello" // string literal
0xFF // hexadecimal literal (255)
075 // octal literal (61)枚举
枚举(enumeration 的缩写)定义了一组命名整型常量。它们使您的代码自我记录并防止原始数字出现错误。
enum TrafficLight {
RED, // 0
YELLOW, // 1
GREEN // 2
};
int main(void) {
enum TrafficLight signal = GREEN;
if (signal == GREEN)
printf("Go!\n");
return 0;
}您还可以分配自定义值:
enum Month {
JAN = 1, FEB, MAR, APR, MAY, JUN,
JUL, AUG, SEP, OCT, NOV, DEC
};现在JAN从 1 开始,每个值自动递增。
为什么它很重要
常量和枚举使您的代码更清晰、更安全:
- 您可以更改一个定义而不是多个数字。
- 编译器可以强制不修改常量。
- 枚举将相关值分组为有意义的集合。
Without them, large programs become fragile and full of unexplained numbers, a maintenance nightmare.
优秀的 C 程序员使用常量来表达意图,而不仅仅是值。
自己尝试一下
将旧程序中的每个数字文字替换为#define或者const。例子:
#define MAX_SCORE 100
const float TAX_RATE = 0.08;创建一个enum一周中的几天,并打印MONDAY和FRIDAY.
在枚举中分配自定义值(例如以SUNDAY = 1).
实验:尝试改变const int x = 5; x = 10;,请注意编译器会阻止您修改它。
使用printf以不同格式打印文字值:
printf("%d %x %o\n", 255, 255, 255); // decimal, hex, octal常量是让 C 程序清晰表达的方式。他们将数字转化为想法,这就是将代码从可用变为可理解的原因。
