C语言---常量

发布于:2025-09-12 ⋅ 阅读:(14) ⋅ 点赞:(0)


常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。

常量分类

1. 整型常量

整型常量就是整数的常量,可以用三种进制来表示:
十进制整数:
由数字 0~9 和正负号组成。例如: 123, -456, 0
八进制整数:
以数字 0 开头,由数字 0~7 组成。例如: 0123 (等于十进制的83), 010 (等于十进制的8)
十六进制整数:
以 0x 或 0X 开头,由数字 0~9 和字母 A~F (或 a~f) 组成。例如: 0x123 (等于十进制的291), 0XFF (等于十进制的255), 0x1a (等于十进制的26)
可以在整数后面加上后缀来指定其类型:
1、L 或 l: 表示长整型 (long),例如 123L
2、LL 或 ll: 表示长长整型 (long long),例如 123LL
3、U 或 u: 表示无符号整型 (unsigned),例如 123U
后缀可以组合使用,如 123UL 表示无符号长整型。

2. 实型常量(浮点型常量)

实型常量就是数学中的小数,在C语言中也称为浮点数。它有两种表示形式:
小数形式: 由数字、小数点和正负号组成。必须包含小数点。
例如: 3.14, -0.123, .618 (等价于0.618), 5. (等价于5.0)
指数形式: 格式为 [±] 数字 [.数字] e|E [±] 数字。
例如:
1.23e5 表示 1.23 × 10⁵ (即123000)
5.6E-3 表示 5.6 × 10⁻³ (即0.0056)
-7.8e+2 表示 -7.8 × 10² (即-780)
默认情况下,实型常量是 double 类型。可以在后面加上后缀来指定类型:
F 或 f: 表示单精度浮点型 (float),例如 3.14f
L 或 l: 表示长双精度浮点型 (long double),例如 3.14L

3. 字符常量

字符常量是用单引号 ‘’ 括起来的一个字符。
普通字符: 例如 ‘A’, ‘b’, ‘5’, ‘#’
转义字符: 以反斜杠 \ 开头,用于表示一些特殊的、无法直接输入的字符。常见的转义字符有:
\n: 换行符
\t: 制表符 (Tab)
\: 反斜杠本身
': 单引号
": 双引号
\0: 空字符 (NULL),字符串的结束标志
\xhh: 用1-2位十六进制数表示字符,如 \x41 表示 ‘A’
\ddd: 用1-3位八进制数表示字符,如 \101 也表示 ‘A’

字符常量在内存中存储的是其对应的ASCII码值(一个整数)。例如,‘A’ 的值就是65。

4. 字符串常量

字符串常量是用双引号 “” 括起来的一个或多个字符序列。
例如: “Hello, World!”, “A”, “123”, “你好”, “” (空字符串)
重要:字符串常量和字符常量的区别
“A” 是字符串常量,它在内存中占两个字节:‘A’ 和 ‘\0’ (结束符)。

‘A’ 是字符常量,它在内存中占一个字节:65 (ASCII码)。

5. 符号常量

符号常量是使用预处理指令 #define 或关键字 const 定义的标识符,用来代表一个常量。

a) 使用 #define 定义

这是在预处理阶段进行简单文本替换的宏定义。

#include <stdio.h>

#define PI 3.14159       // 定义符号常量PI,值为3.14159
#define MAX_SIZE 100     // 定义符号常量MAX_SIZE,值为100
#define GREETING "Hello" // 定义字符串符号常量

int main() {
    double radius = 5.0;
    double area = PI * radius * radius; // 预处理后此行变为 double area = 3.14159 * radius * radius;

    int arr[MAX_SIZE]; // 预处理后变为 int arr[100];

    printf("%s\n", GREETING);
    printf("Area is: %f\n", area);
    return 0;
}

特点:
不加分号 ;。
只是简单的文本替换,不占用内存,没有数据类型的概念。

b) 使用 const 关键字定义

这是在编译阶段处理的,会分配存储空间,具有明确的类型检查。

#include <stdio.h>

int main() {
    const double PI = 3.14159;     // 定义const常量PI
    const int MAX_SIZE = 100;
    const char GREETING[] = "Hello";

    // PI = 3.14; // 错误!试图修改const常量的值,编译器会报错

    double radius = 5.0;
    double area = PI * radius * radius;

    int arr[MAX_SIZE];

    printf("%s\n", GREETING);
    printf("Area is: %f\n", area);
    return 0;
}

特点:
需要指定数据类型。
定义时必须初始化。
试图修改它的值会导致编译错误。
具有作用域的概念(例如,在函数内定义的const常量只在该函数内有效)。

#define 与 const 区别

替换机制:#define 是进行简单的文本替换,而 const 是声明一个具有类型的常量。#define 定义的常量在编译时会被直接替换为其对应的值,而 const 定义的常量在程序运行时会分配内存,并且具有类型信息。

类型检查:#define 不进行类型检查,因为它只是进行简单的文本替换。而 const 定义的常量具有类型信息,编译器可以对其进行类型检查。这可以帮助捕获一些潜在的类型错误。

作用域:#define 定义的常量没有作用域限制,它在定义之后的整个代码中都有效。而 const 定义的常量具有块级作用域,只在其定义所在的作用域内有效。

调试和符号表:使用 #define 定义的常量在符号表中不会有相应的条目,因为它只是进行文本替换。而使用 const 定义的常量会在符号表中有相应的条目,有助于调试和可读性。

总结与对比

常量类型 表示方式 示例 特点
整型常量 十进制、八进制(0开头)、十六进制(0x开头) 123, 0123, 0x1A3 可加L、U等后缀指定类型
实型常量 小数形式、指数形式 3.14, -1.2e-5 默认double,可加F、L后缀
字符常量 单引号 ‘’ ‘A’, ‘\n’ 存储的是ASCII码值,占1字节
字符串常量 双引号 “” “Hello” 以’\0’结尾,占字符数+1字节
符号常量(#define) #define 标识符 常量值 #define PI 3.14 预处理替换,无类型,不分配内存
符号常量(const) const 类型 标识符 = 值; const float pi = 3.14; 有类型,分配内存,不可修改

网站公告

今日签到

点亮在社区的每一天
去签到