☰ 目录

在 C 语言中,常量指的是在程序运行期间其值不会发生改变的量。下面介绍 C 语言里常量的类型、定义方式以及使用示例:

一、字面常量(Literal Constants)

字面常量是在代码中直接给出的固定值,它会依据书写形式来确定自身的数据类型。

1. 整数常量

  • 十进制:像100-5这类就是十进制整数常量。
  • 八进制:以0开头的数,例如012(相当于十进制的 10)。
  • 十六进制:以0x或者0X开头,比如0xFF(对应十进制的 255)。
  • 后缀:可以使用L(表示长整型)和U(表示无符号型),像100UL就是一个无符号长整型常量。

2. 浮点常量

  • 小数形式:例如3.140.5.25
  • 指数形式:如1.2e3(也就是 1200.0)、5E-2(即 0.05)。
  • 后缀fF表示单精度浮点数,lL表示长双精度浮点数,例如3.14F

3. 字符常量

  • 用单引号括起来的单个字符,例如'A''\n'
  • 转义序列:像'\t'(水平制表符)、'\x41'(十六进制表示的字符A)都属于转义序列。

4. 字符串常量

  • 由双引号括起来的字符序列,例如"Hello""123\n"
  • 字符串在内存中会以'\0'作为结束标志,所以字符串"A"实际上包含两个字符:'A''\0'

二、符号常量(Symbolic Constants)

符号常量是赋予常量一个名字,通过名字来引用该常量。

1. #define 预处理器指令(宏常量)

#define PI 3.14159
#define MAX_SIZE 100
  • 特点:在编译前会进行文本替换,没有类型检查。
  • 示例
printf("圆的周长: %f\n", 2 * PI * r);

2. const 关键字(常量变量)

const int DAYS_IN_WEEK = 7;
const float GRAVITY = 9.8f;
  • 特点:具有类型,存储在内存中,不能被修改。
  • 示例
int arr[DAYS_IN_WEEK];  // 合法(C99及以后版本支持)

三、枚举常量(Enumeration Constants)

枚举常量用于定义一组具名的整数常量。

enum Color { RED, GREEN, BLUE };  // 默认从0开始
enum Weekday { MON = 1, TUE, WED, THU, FRI, SAT, SUN };
  • 示例
enum Color c = GREEN;  // c 的值为1
printf("GREEN = %d\n", c);  // 输出: GREEN = 1

四、常量表达式

常量表达式是在编译时就能计算出结果的表达式。

#define A 5
#define B 3
const int C = A + B;  // C 的值在编译时确定为8
  • 应用场景:可用于数组大小定义、case标签等。
int arr[A * B];  // 合法

arr[] 是用于声明数组(Array)的语法。数组是一种存储相同类型元素的连续内存区域,通过索引(下标)访问每个元素。


五、注意事项

  1. 字符串与字符的区别
    • 'A' 是字符常量,类型为int,占 1 个字节。
    • "A" 是字符串常量,类型为char[2],包含'A''\0'
  2. 宏常量 vs const 变量
    • 宏常量:没有类型,仅进行简单替换,可能会产生副作用。
    • const 变量:有类型,具备类型检查和作用域规则。
  3. 指针常量
    • const int* p:指针指向的内容不能被修改。
    • int* const p:指针本身的值不能被修改。
    • const int* const p:指针及其指向的内容都不能被修改。

示例代码

#include <stdio.h>

#define MAX(a, b) ((a) > (b) ? (a) : (b))  // 宏函数

int main() {
    const int MAX_SCORE = 100;
    enum Month { JAN = 1, FEB, MAR };
    
    int x = 5, y = 10;
    printf("最大值: %d\n", MAX(x, y));  // 使用宏函数
    
    printf("2月是第 %d 个月\n", FEB);  // 输出: 2月是第 2 个月
    
    // MAX_SCORE = 200;  // 错误:不能修改常量
    return 0;
}

意见反馈

AI助手

代码编辑器