C语言---常量
文章目录
- 常量分类
- 1. 整型常量
- 2. 实型常量(浮点型常量)
- 3. 字符常量
- 4. 字符串常量
- 5. 符号常量
- a) 使用 #define 定义
- b) 使用 const 关键字定义
- #define 与 const 区别
- 总结与对比
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。
常量分类
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常量PIconst 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; | 有类型,分配内存,不可修改 |